Task06:函数与Lambda表达式
def 函数名(形参):
巴拉巴拉
Python 允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
默认参数:一定要放在位置参数 后面,不然程序会报错。 def printinfo(name , age = 8) age是默认参数,没有赋值的时候是8,赋值了以后是赋值的值。
个数可变位置参数:*XXX,任意个数,自动组装成元组。就是不知道元素的个数。
个数可变的关键字形参:**XXX,任意个数,组成字典。
def medef(*a,**b):
print(a,b)
medef(10,20,30,a=10,b=20)
#位置参数和关键字参数都只能有一个,前面所有的都会放入位置形参中,关键字形参是 = 形式
#
(10, 20, 30) {'a': 10, 'b': 20}
命名的关键字参数:*, XXX ,调用时必须要和形参名字一样才能赋值。
def mee(*,nkw):
print(nkw)
mee(nkw = 10)
#
10
顺序:位置参数、默认参数、可变参数(*args-tuple)、命名关键字参数( *,XXX)和关键字参数(**XXX-dict)
内部想修改外部变量的时候:
num = 1
def fun1():
global num
# 内部想修改外部变量时,需要使用 global 关键字声明,后面变量就全是修改后的值了
num = 123
print(num)
fun1()
print(num)
#
123
1
内嵌函数:A函数中的函数只能在A函数中调用
闭包:
保证安全,外部不能访问变量
内部函数调用了外部变量(一般不是全局变量)
外层函数返回值是函数
def meoutter(x):
num = 10
def meintter(y):
nonlocal num #闭包中修改外部变量用nonlocal
num = 100
print(num)
return x*y
print(num)
return meintter
i = meoutter(3) #先给外部赋值
print(i(4)) #
#
10
100
12
匿名函数定义:
lambda 形参 : 表达式
非函数式编程:(加减循环…)
def f(x):
for i in range(0,len(x)):
x[i] +=10
return x
x = [1,2,3]
f(x)
print(x)
函数式编程:(调用相关函数)
def f(x):
y = []
for item in x:
y.append(item + 10)
return y
x = [1,2,3]
f(x)
print(x)
练习题:
-
怎么给函数编写⽂档?
def f(x): "在函数头(包含def关键字的那一行)的下一行用一对单引号或双引号将注释括起来。可以使用'函数名.__doc__'或help()查看" print(f.__doc__) print(help())
-
怎么给函数参数和返回值注解?
def f(x:int)->int:
-
闭包中,怎么对数字、字符串、元组等不可变元素更新。
nonlocal
-
分别根据每一行的首元素和尾元素大小对二维列表 a = [[6, 5], [3, 7], [2, 8]] 排序。(利用lambda表达式)
a = [[6, 5], [3, 7], [2, 8]] a = sorted(a,key=lambda i:i[0]) a = sorted(a,key=lambda i:i[-1])
-
利用python解决汉诺塔问题?
有a、b、c三根柱子,在a柱子上从下往上按照大小顺序摞着64片圆盘,把圆盘从下面开始按大小顺序重新摆放在c柱子上,尝试用函数来模拟解决的过程。(提示:将问题简化为已经成功地将a柱上面的63个盘子移到了b柱)
def f(a):
new=list(reversed(a)) #颠倒
return new
a=list(range(64))
c=f(f(a)) #颠倒两次
print(c)