python基础2:函数

一、python 的四个作用域:

名称 描述
L 局部作用域
E 外部嵌套函数作用域
G 全局作用域
B 内建作用域

二、lambda 表达式(又名匿名函数表达式)
作用:
创建一个匿名函数对象
同def类似,但不提供函数名
语法:

lambda [形参1, 形参2, ...] : 表达式

语法说明

 1. lambda 只是一个表达式,它用来创建一个函数对象
 2. 当lambda表达式调用时,先执行冒号后的表达式,并返回表达式的结果的引用
 3. lambda 表达式创建的函数只能包含一条表达式
 4. lambda比函数简单,且可以随时创建和销毁,有利于减少程序的偶合度

三、eval 和 exec 函数
3.1 eval函数:
作用:
把一个字符串当成一个表达式执行,返回表达式执行后的结果
格式:

eval(source(string), globals=None, locals=None)

print(eval("x+y", {'x':10, 'y':20}))   # 30
print(eval("x+y", {'x':10, 'y':20}, {'x':1, 'y':2}))  # 3
print(eval("x+y", {'x':10, 'y':20}, {'x':1}))  # 21
先查找局部变量,没有局部变量则向上一级找全部变量

3.2 exec函数:
作用:
把一个字符串当成程序来执行
格式:

exec(source(string), globals=None, local=None)

示例:

s = 'x=100; print("hello"); x += 1; print(x)'
print(s)
exec(s)

四、高阶函数 High Order Function
什么是高阶函数:
满足下列条件中的一个的函数即为高阶函数

  1. 函数接受一个或多个函数作为参数传入
  2. 函数返回一个函数

python内置(builtins)的高阶函数:

    map, filter, sorted

4.1 map 函数:
map(func, *iterables) 用函数对可迭代对象中的每一个元素作为参数计算出新的可迭代对象,当最短的一个可迭代对象不再提供数据时,此可迭代对象生成结束
note: iterables前面有 *, 可以由多个可迭代参数对象
示例:

# 生成一个可迭代对象, 要求此可迭代对象生成
#   1**4, 2**3, 3**2, 4**1
#    1     8     9    4 
for x in map(pow, [1,2,3,4], [4,3,2,1]):
    print(x)

# 求 1**9 + 2**8 + 3**7 + ... 9**1的和
print(sum(map(pow, range(1, 10), range(9, 0, -1))))
# *iterables: range(1, 10), range(9, 0, -1)

4.2 filter函数
格式:
filter(func, iterable) (note: iterable前面没有*, 表示只能有1个参数)
作用:
筛选可迭代对象iterable中的数据,返回一个可迭代对象,此可迭代对象将对iterable进行筛选
函数func 将对iterable中的每个元素进行求值,返回False时将此数据丢弃,返回True,则保留此数据

l = [x for x in filter(lambda x:x%2==0, range(10))]
print(l)
#  []不能少

tarena@tedu:~/myy$ python3 isodd.py
[0, 2, 4, 6, 8]

4.3 sorted 函数:
作用:
将原可迭代对象的数据进行排序,生成排序后的列表
格式:
sorted(iterable, key=None, reverse=False)
参数说明:

参数 描述
iterable 可迭代对象
key 绑定函数,此函数用来提供一个排序的依据
reverse 标志用来设置是否降序排序(从大到小), 默认是升序
input1:
names = ['Lyusdnik', 'Spike', 'Ann', 'Tykel']
name_sort = sorted(names, key=len, reverse=False)
print(name_sort)
output1:
['Ann', 'Spike', 'Tykel', 'Lyusdnik']

input2:
l = [5, -2, 3, -8, 1, 4]
print(sorted(l))
print(sorted(l, key=abs, reverse=False))
output2:
[-8, -2, 1, 3, 4, 5]
[1, -2, 3, 4, 5, -8]

input3:
def rev(s):
    return s[::-1]      # 逆序
name_rev = sorted(names, key=rev)  # key 排序的依据
print(name_rev)
output3:
['Spike', 'Lyusdnik', 'Tykel', 'Ann']

五、递归函数
递归说明:
递归一定要控制递归的层数,当符合某一条件时要终止递归
几乎所有的递归都能用循环来代替

递归的优缺点:

  优点:
    递归可以把问题简单化,让路径更为清晰,代码更为简洁
  缺点:
    递归因系统环境影响大,当递归深度太大时,可以会得到不可预知的结果

递归实现的方法:先假设函数已经实现

def myfac(x):
    if x == 1:      # 设置终止迭代条件
        return 1
    return x * myfac(x - 1)

print(myfac(5))
# 递归实现斐波那契数列
def fab(n):
    # 递归调用必须有一个出口即返回值 
    if n == 0 or n == 1:
        return 1
    # 递归:函数的自身调用,变量必须有变化
    return fab(n-1) +fab(n-2)

print(fab(10))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章