- 函数的参数
- 局部变量和全局变量
- 递归函数和匿名函数
- 高阶函数
- 函数式编程了解
- 作业
一、函数的各种参数
关键参数和位置参数:只要记住关键参数必须要放在位置参数后面就行了
#参数问题 def test(x,y,z): print(x) print(y) print(z) test(z=1,x=2,y=3)#2,3,1,关键参数顺序不受影响 test(1,2,3)#1,2,3,位置参数顺序就是传入的顺序 #test(1,y=2,4)#error,关键参数必须放在位置参数的后面 test(1,z=2,y=2)
非固定参数(可变参数?):*args,**kwargs
#可变参数 def test1(*args):#形参的数量不固定 print(args) test1(1,2,3,4,5,)#实参放入元组中 #结合位置参数 def test2(x,*args): print(x) print(args) test2(1,2,3,4,5,6,7) #接受字典的可变参数---关键字参数 def test3(**kwargs): print(kwargs) test3(name='sun',age='8',sex='M',tall="168") test3(name='sun') #组合使用 def test4(name,**kwargs): print(name) print(kwargs) test4('sun') test4('sun',age=10) test4('sun',age=10,sex="m") def test5(name,age=10,**kwargs): print(name) print(age) print(kwargs) test5('sun',24,hobby='sleep') test5('sun',sex='m',age=3)#age=3的位置可以放在后面 def test6(name,age=18,*args,**kwargs): print(name) print(age) print(args) print(kwargs) test6('sun',24,1,2,3,sex='m',hobby='sleep')#注意以下*args是如何传参的
二、局部变量和全局变量
针对数字、字符串这样的变量,在函数内部的参数的改变不会影响函数外面的全局变量的值
#局部变量的问题 name='SYR' def change_name(name): print('before change',name) name='syr' print('after change',name) change_name(name) print(name)
执行结果:
before change SYR
after change syr
SYR
如果执意要在函数内部改变函数外的同名全局变量,可以在函数内部申明global
school='CQPUT' def change(name): global school#在函数内就可以修改全局变量了 school='cqput' print('before change',name,school) name='syr' print('after change',name) change(name) print('school',school) #局部变量前面加上global之后,就可以修改全局变量
执行结果:
before change SYR cqput
after change syr
school cqput
可以看到shcool在内部改变了也会直接改变函数外面的那个school
但是针对数组,字典等,函数内部的参数改变会直接折射到函数外
#列表,集合,字典这些,在函数内部修改也会影响到全局变量 names=['sun','yue','ru'] def change_names(): names[0]='孙' print(names) change_names() print(names)#namse被修改 了
执行结果:
['孙', 'yue', 'ru']
['孙', 'yue', 'ru']
三、递归函数和匿名函数
递归函数的特性:
- 必须有一个明确的结束条件
- 每一次进入更深一次的递归,问题的规模都比上次减少
- 递归的效果很低,可能会导致栈溢出(函数的调用是通过栈实现)
简单的递归示例:二分查找
#Author:Yueru Sun def binary_search(dataset,find_num): print(dataset) if len(dataset)>1: mid=int(len(dataset)/2) if dataset[mid]==find_num: print('找到%d啦,在第%d位置'%(dataset[mid],mid)) elif dataset[mid]>find_num: print('要查找的数字在%d的左边'%dataset[mid]) return binary_search(dataset[0:mid],find_num) else: print('要查找的数字在%d的右边'%dataset[mid]) return binary_search(dataset[mid+1:],find_num) else: if dataset[0]==find_num: print('找到数字') else: print('查找失败') # data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35] binary_search([1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35],1)
匿名函数:
就是不需要显示的指定函数
简单示例:
#这段代码 def calc(n): return n**n print(calc(10)) #换成匿名函数 calc = lambda n:n**n print(calc(10))
结合map:
res = map(lambda x:x**2,[1,5,7,4,8]) for i in res: print(i)
四、高阶函数
高阶函数就是一个函数接收另外一个函数作为参数。
简单示例:
def add(x,y,f): return f(x) + f(y) res = add(3,-6,abs) print(res)
常用的高阶函数之map:
>>> def f(x): ... return x * x ... >>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) [1, 4, 9, 16, 25, 36, 49, 64, 81]
常用的高阶函数之reduce:
>>> def add(x, y): ... return x + y ... >>> reduce(add, [1, 3, 5, 7, 9]) 25
常用的高阶函数之filter:
和map()
类似,filter()
也接收一个函数和一个序列。和map()
不同的时,filter()
把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素
def is_odd(n): return n % 2 == 1 filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]) # 结果: [1, 5, 9, 15]
常用的高阶函数之sorted:
sorted()函数也是一个高阶函数,它还可以接收一个key
函数来实现自定义的排序,例如按绝对值大小排序:
>>> sorted([36, 5, -12, 9, -21], key=abs) [5, 9, -12, -21, 36]
五、函数式编程
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317848428125ae6aa24068b4c50a7e71501ab275d52000
六、作业
Python操作文件模拟SQL语句功能
代码: