关键参数和位置参数:只要记住关键参数必须要放在位置参数后面就行了
#参数问题 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 SYRafter change syrSYR
如果执意要在函数内部改变函数外的同名全局变量,可以在函数内部申明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 cqputafter change syrschool 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的左边'