Python科学计算第四章 函数的设计和使用

Python科学计算第四章 函数的设计和使用 函数中对可变序列使用下标操作或者原地操作方法可修改序列中的值参数类型形参位置、默认值、可变长度 参数实参关键字、序列解包 参数位置参数依次读取默认值参数调用时有默认值的参数可以赋值也可不赋值位置参数必须放在默认值参数前正确def func(a, b, c3)错误def func(a1, b)默认值参数只在函数定义时被解释一次例如def demo(newitem,old_list[]): old_list.append(newitem) return old_list print(demo(5,[1,2,3,4])) [1, 2, 3, 4, 5] print(demo(aaa,[a,b])) [a, b, aaa] print(demo(a)) [a] print(demo(b)) [a, b] # 出现问题因为old_list在函数定义的时候就被定义了之后每次调用不会重新定义一次所以还是使用上一条使用的列表 可变序列作为默认值要注意。上述如要改正应把定义改为 def demo(newitem,old_list[]):之后在函数体内部定义 old_list []关键字参数位置参数必须放在关键字参数前正确func(a, b, c3)错误func(c3, a, b)关键字实参引用时func(a3,b4)可变长度参数*a 接收多个位置参数存在元组中例如def demo(*a): print(a) demo(1, 2, 3, [4, 5]) (1, 2, 3, [4, 5]) **b 接收多个关键字参数存在字典中例如def demo(**b): print(b) demo(a1, k22) {a:1, k2:2} 序列解包*解包对元组、列表*解包相当于逐个当位置参数输入对字典*解包只解包.keys()def add(a, b, c): print(a b c) # 对列表与元组解包 add(*[10, 20, 30]) # 等价于add(10, 20, 30) 60 add(*(10, 20, 30)) # 等价于add(10, 20, 30) 60 # 对字典解包 def show_keys(k1, k2): print(fk1{k1}, k2{k2}) show_keys(*{x: 1, y: 2}) # 等价于show_keys(x, y)**解包对字典**解包相当于关键字参数def demo(name, age): print(name, age) # 对字典**解包 greet(**{name:A, age:20}) # 等价于demo(nameA, age20)序列解包不能放在关键参数之后因为序列解包等价位置参数传参顺序位置参数 → 序列解包* → 关键字参数 → 字典解包**传参示例func(1, *[2, 3], d4, **{e: 5})例题1. 若有如下函数定义则func(1, 2, 3, *(4, 5), c20, **{d:30, e:40})的返回结果为___。def func(a, b10, *c, **d): return a b max(c) min(d.values())2. 若有如下函数定义则demo(1, 2, c3, d4)的运行结果为___。def demo(*a, **b): print(a, end ) print(b)3. 若有如下函数定义则func2(1, 2, 3, *(4, 5), c20, **{d:30, e:40})的返回结果为___。def func2(a, b10, *c, **d):return a b sum(c) min(d.values())def func2(a, b10, *c, **d): return a b sum(c) min(d.values())答案# 答案 def func(a, b10, *c, **d): return a b max(c) min(d.values()) def demo(*a, **b): print(a, end ) print(b) def func2(a, b10, *c, **d): return a b sum(c) min(d.values()) # 题1 r1 func(1, 2, 3, *(4, 5), c20, **{d:30, e:40}) print(r1) 28 # 题2 demo(1, 2, c3, d4) (1, 2) {c: 3, d: 4} # 题3 r3 func2(1, 2, 3, *(4, 5), c20, **{d:30, e:40}) print(r3) 35 全局与闭包概念全局变量global闭包变量nonlocal局部变量闭包中找最近的定义的变量nonlocal闭包中定义global变量会改最外层的那个全局变量例题执行下面的程序输出结果为___。def outer(): def inner1(): x 10 def inner2(): print(x, end ) def inner3(): global x x 20 x 30 inner1() inner2() inner3() print(x, end ) x 40 outer() print(x, end )答案30 30 20lambda表达式lambda 参数列表: 表达式lambda 表达式为匿名函数# 函数作用在列表元素上作为排序依据 lst sorted([(1, 2), (3, 1), (2, 3)], keylambda x: x[1]) print(lst) [(3, 1), (1, 2), (2, 3)] # map调用匿名函数 lst2 list(map(lambda x: x ** 2, [1, 2, 3, 4])) print(lst2) [1, 4, 9, 16]