函数学习,要点总结如下:
1. 函数默认可以没有返回值,没有返回值则返回为None
2. 函数可以有多个返回值,类型可以不同,但其实多个返回值整体上是一个元组
3. 关键参数不能够写在位置参数前面
1 # -*- coding:utf-8 -*- 2 # LC 3 4 import time 5 #函数: 6 def logger(): #定义日志函数 7 time_format = '%Y-%m-%d %X' #定义时间格式 8 time_current = time.strftime(time_format) #抓取当前时间 9 with open("log_file","a") as f: 10 f.write("%s this is end "%time_current) 11 12 def func1(): 13 """to declare the function""" #说明这个函数是做什么的 14 print("this is function1") #函数工作模块,逻辑 15 logger() 16 return 0 #函数返回值 17 18 #过程: #过程是没有返回值的函数,在python中,过程默认返回None 19 def func2(): 20 """function 2""" 21 print("this is function2") 22 logger() 23 return 1,{"name":"lvcheng","age":"18"} #可返回多个值 24 25 x = func1() #调用函数 26 y = func2() 27 print(x) 28 print(y) 29 30 def func3(x,y,z): #x,y为形参,同为位置参数 31 print(x,y,z) 32 return x,y,z 33 34 func3(1,2,3) #位置参数调用,位置需要与形参一一对应 35 func3(1,2,z=3) 36 func3(y=2,z=3,x=1) #关键字调用,关键参数,与形参顺序无关 37 38 #默认参数 39 def func4(x,y=3): #y是默认参数 40 print(x) 41 print(y) 42 func4(1) 43 func4(1,5) 44 #默认参数可以不传递,如果有传递,则是传递的值 45 #用途 1,默认安装的时候,2, 链接数据库的端口号等 46 47 #参数组,对于实参不固定函数的实现 48 def func5(*args): # *是关键字,元组的方式传递 49 print(args) 50 51 # *args接受N个位置参数,转换成元组的方式 52 53 test1 = func5(1,2,3,4,5) # 1,2,3,4,5以(1,2,3,4,5)元组的方式传递给args 54 test1 = func5(*[1,2,3,4]) 55 56 #参数组,以字典的方式实现 57 58 def func6(**kwargs): 59 print(kwargs) 60 print(kwargs['name']) #取字典里的值 61 print(kwargs['age']) 62 # **kwargs接收N个关键字参数,转换成字典的方式传递 63 64 65 test2 = func6(name="lc",age=9) #必须传递关键字参数 66 test2 = func6(**{"name":"lc","age":10}) 67 68 69 def func7(name,age=19,**kwargs): #有形参,有默认参数,有参数组 70 print(name) 71 print(age) 72 print(kwargs) 73 74 test3 = func7("lc",21,sex="M",hobby="girl") 75 test3 = func7("lc",sex="M",hobby="girl",age = 32) 76 77 def func8(name,age=19,*args,**kwargs): 78 print(name) 79 print(age) 80 print(args) 81 print(kwargs) 82 83 func8("lc",2,3,4,sex="M",hobby="money")
1 #局部变量 2 def change_age(age): 3 global name #函数内申明全局变量,全局生效 4 print("before age",age) 5 age = 18 #局部变量,这个函数就是这个变量的作用域 6 name = "LLL" 7 print("after change age",age) 8 9 age = 20 10 name = "LC" 11 print("!!!name",name) 12 change_age(age) 13 print(age) 14 print("name:",name) 15 16 #字符串,整数,元组在局部变量不能修改;列表,字典,集合,类在局部能够修改全局变量 17 names = ["LC","Jack","Ma"] 18 def change_name(): 19 names[0] = "Lucy" 20 print(names) 21 print(names) 22 change_name() 23 print(names) 24 25 #递归函数 26 def calc(n): 27 print(n) 28 if int(n/2)>0: 29 return calc(int(n/2)) 30 31 calc(10) 32 33 #递归函数特性 34 #1. 递归行数必须有明确的结束条件,2. 递归函数没进行一次递归,问题规模相对之前会减少,3.递归效率不高