一,函数重命名机制(None关键字)
# Fibonacci 数列
def fib(n):a, b = 0, 1 # a, b 可以同时赋值while a < n: # a - nprint(a, end=' ')a, b = b, a + bprint()fib(10) # 0 1 1 2 3 5 8 print(fib) # <function fib at 0x0000020856289048> 是个地址值# py函数的重命名机制
''' 函数定义会把函数名引入当前的符号表中。函数名称的值具有解释器将其识别为用户定义函数的类型。这个值可以分配给另一个名称,该名称也可以作为一个函数使用。
'''
f = fibprint(f(10))
'''
0 1 1 2 3 5 8
None
无返回值的过程(None是内置名称), 没有return关键字的不叫函数,只得说过程
'''# return 关键字 return Fibonacci数列
def fib2(n):result = []a, b = 0, 1while a < n:result.append(a)a, b = b, a + breturn resultf2 = fib2
print('=' * 20)x = f2(10) # 接收Fibonacci的列表
print(x) # [0, 1, 1, 2, 3, 5, 8]
二, 参数的默认值, 默认值的共享
# 定义默认的参数 和 不变的参数
def show(name, gender='男', age=18):print('introduction: name: ',name, 'gender: ', gender, 'age: ', age)show('abc') # 不变的参数 introduction: name: abc gender: 男 age: 18
show('abc', gender='女', age='10') # 还可以再赋值 introduction: name: abc gender: 女 age: 10
show('abc', '女', 19) # introduction: name: abc gender: 女 age: 19
''' 总结:1,函数调用的参数要一一对应2,没有默认值的参数一定要传值,有默认值的可以不给,算是一种重载的方式把3,默认值的参数有两种赋值方式:a, key = vale赋值b, 直接给value'''# 关于默认值
i = 5
def mySilence(arg = i): print(arg)
i = 6
mySilence() # 5 默认值就是5了,改变了i,没改变arg# 共享默认值的问题
def myList(a, L=[]):# 返回一个列表L.append(a)return Lprint(myList(1))
print(myList(2))
print(myList(3))
'''
[1]
[1, 2]
[1, 2, 3]
'''# 解决共享的问题
def myListUpgrade(a,L=None): # 把默认值None 判断,再创建一个if L == None: L = []L.append(a)return Lprint(myListUpgrade(1))
print(myListUpgrade(2))
'''
[1]
[2]
'''# 用*(多个参数) **(字典)def myArgs(kind, *argments, **keywords):print('kind: ', kind)for arg in argments:print(arg)print('-' * 20)for kw in keywords: print(kw, ' : ', keywords[kw])# myArgs 函数
d = {'key1': 'v1','key2': 'v2','key3': 'v3'
}
myArgs('a kind', 'abc', 'bcd', **d) # ** 是字典集合'''
kind: a kind
abc
bcd
--------------------
key1 : v1
key2 : v2
key3 : v3
'''
三,解包参数列表
# 解包参数列表
x = [0, 10]
# r = range(x) TypeError: 'list' object cannot be interpreted as an integer
r = range(*x) # 用 * 代表多个参数
print(r) # range(0, 10)
print(list(r)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]def showInfo(name, gender, age):print(name, gender, age)d = {'name': 'abc','gender': 'female','age': 19
}showInfo(**d) # 用** 表示字典参数
# abc female 19
三,lambda表达式
def make_incrementor(n):return lambda x: x + n# 让此表达式从10开始
up = make_incrementor(10)
print(up(1)) # 传入n 结果从10 加起print(up(up(100))) # 100 + 10 + 10# lambda传递一个小函数作为参数
def test_lambda():pairs = [(1, 'one'), (4, 'two'), (3, 'three'), (2, 'four')]pairs.sort(key = lambda pair : pair[0]) # 按数字升序print(pairs) test_lambda()
'''
[(1, 'one'), (2, 'four'), (3, 'three'), (4, 'two')]
'''
写了函数后,终于能拿出完整的代码了…