函数
1.函数的定义
· 函数的定义,即以def开头,后面包括函数名以及圆括号,圆括号内可以是调用的参数名,也可以空着,和c++区别不大。
· 命名完成后按enter键会自动换行并且在后面加上冒号,同时自动缩进。
· 可以返回一个值,也可以不返回,若要返回值使用return
2.函数的调用
· 没有返回值的函数
def hello():
print('hello world')
hello() #hello world
· 有参数的函数
a=int(input('请输入第一个数:'))
b=int(input('请输入第二个数:'))
def add(a,b):
return a+b
c=add(a,b)
print(c)
3.函数参数
· 位置参数
位置参数的位置需要固定,即不能更改,在调用时也要注意。
def lalala(a):
print(a)
a=3
lalala(a)
· 默认参数
默认参数就是一个固定的参数,可以在写函数定义时就写好,如果在引用的过程中为默认参数赋值,则使用新的值,否则在函数运行过程中运用默认的值。
同时应当注意的是,默认参数应当放在位置参数之后,否则会报错。
正确
def weizhi(a,b=8):
print(a+b)
weizhi(3) #11
错误
def weizhi(a=8,b):
print(a+b)
weizhi(3) #报错
· 可变参数
就是引用的函数参数可以是一个元组,元组里的元素可以是任何类型的,可以是字符型也可以是浮点型等,加一个*号就可以
def asd(*a):
print('第二个字符是:',a[1])
print('第四个字符是:',a[3])
asd(60,70,80,'那鲁多')
#第二个字符是: 70
#第四个字符是: 那鲁多
另外,在使用可变参数时仍然可以使用位置参数和默认参数,但应当注意的是,如若位置函数放在可变函数之后,应当在引用时特地将位置函数的值定义好。(其实我觉得在引用时避免就好了)
def asd(*a,exp):
print(exp)
asd(60,70,80,'那鲁多',exp=8)
#8
· 关键字参数
这个东西,也不知道有啥用。。。但既然视频里看见了也列一下,也许以后用到就会懂了。
def qwer(**k):
print(k)
qwer(a=1,b=2,c=3)
#{'a': 1, 'b': 2, 'c': 3}
4.变量
和c++一样,python的变量也分为局部变量和全局变量。
局部变量:在函数内部定义的变量
全局变量:在函数外部定义的变量
局部变量,只能在函数内部被使用,而全局变量,可以在整个程序中使用。
如果我们在函数中定义了一个与全局变量名字相同的局部变量,并且想要通过改变该局部变量的值来改变全局变量的值,可以使用global关键字
def qwer():
global a
a=10
print(a)
a=5
qwer()
print(a)
#10 10
可以看到,全局变量a的值被改变
5.内嵌函数
即,函数里面套函数,套娃哈哈哈
def q(x):
def w(y):
return x+y
return w
print(q(3)(4))
#7
6.闭包
对于闭包,我看了一些资料,但还是不大懂,感觉意思就是,内部函数,对于外部函数中的外部变量(非全局变量)进行引用,那么内部函数就是闭包。
值得注意的是,内部函数,无法对调用的外部变量的值进行更改,否则会报错。这与全局变量又有所不同,如果在函数内部建立一个新的局部变量,但名字与全局变量一样,那么会建立一个与全局变量名字一样的局部变量,不会报错。
同时,如果想修改,可以使用nonlocal关键字
def q():
num=10
def w():
global num
num=100
print(num)
w()
print(num)
q()
#100 10
如果用global关键字,可以看到值并不会改变,但是用nonlocal关键字就不同,我也不知道为啥。。。
def q():
num=10
def w():
nonlocal num
num=100
print(num)
w()
print(num)
q()
#100 100
7.lambda表达式
lambda表达式,省去了命名函数的苦恼(命名恐惧症福音)。一般用一次就扔,可以精简代码,同时不用翻到很上面去看函数定义。
需要注意的是,它只能调用自己定义式中的变量
y=lambda x:x*2
print(y(3))
#6
8.lambda表达式中可以用到的一些东西
· filter
过滤序列,过滤掉不符合条件的元素,返回剩下的元素。只留下布尔值为true的函数
同时,如果没有函数,要在函数的位置加上None
judge=lambda x:x%2
temp=list(filter(judge,[1,2,3,4,5,6,7,8,9]))
print(temp)
a=list(filter(None,[1,0,True,False]))
print(a)
· map
将元组中的元素一一按照函数进行映射,然后将映射值重新组成一个元组。另外提一句,注意要加一个list将映射值组成元组。
odd=lambda x:x*2+1
a=list(map(odd,[1,2,3,4,5,6,7,8,9]))
print(a)
#[3, 5, 7, 9, 11, 13, 15, 17, 19]
9.递归
套娃套娃再套娃,我自己算自己
举两个小例子
**·**阶乘
def qwer(n):
if n==1:
return n
else:
return n*qwer(n-1)
print(qwer(5))
#120
**·**斐波那契数列
def fab (n):
if n<1:
print('输入有误')
if n==1 or n==2:
return 1
else:
return fab(n-1)+fab(n-2)
a=list()
n=int(input('请输入天数:'))
k=1
while k<=n:
a.append(fab(k))
k=k+1
print(a)
引用
https://mp.weixin.qq.com/s/jJoHrWYL4U3kvug5uA1UCg
时隔多天,再写一篇。感觉这样下去以后水几千字的论文作业都不是事了啊。
应是天仙狂醉,乱把白云揉碎。