函数
函 数
一、定义函数
格式:
def 函数名(参数列表):
语句
return 表达式
def :函数代码块以def关键字开始
函数名:遵循标识符规则
():参数列表的开始与结束
参数列表(参数1,参数2,……,参数n):任何传入函数的参数和变量
必须放在圆括号中间,用逗号分隔。函数从函数调用者哪里获取的信息
冒号:函数内容(封装的功能)以冒号开始,并且缩进
语句:函数封装的功能
return:一般用于结束函数,并返回信息给函数的调用者
表达式:即为返回给函数调用者的信息。
注意:最后的return表达式,可以不写,相当于return None
#最简单的函数,无参数,无返回值的函数 def MyPrint(): print("sunck is a goog man") print("sunck is a handsome man") print("sunck is a nice man ")
二、函数的调用
格式:函数名(参数列表)
函数名:是要使用的功能的函数函数名
参数列表:函数的调用者给函数传递的信息,如果没有参数,下括号也不能省略
函数调用的本质:实参给形参赋值
MyPrint()
MyPrint()
三、函数的参数
# 函数的参数 #需求:编写一个函数,给函数一个字符串和一个年龄,在函数内部打印出来 # 形参(形式参数):定义函数时小括号中的变量,本质是变量 # 参数必须按顺序传递,个数目前要对应 def Myprint(str, age): print(str, age) #实参(实际参数):调用函数时给函数传递的数据,本质是值 Myprint("xunck is a good man",16) def my (a, b): c = max(a,b) print(c) my(1,3) # 函数的返回值 # 编写函数,实现功能,返回这两个数的和 def mySum(num1, num2): sum = num1 + num2 #执行完return语句后,该函数就结束 return sum #将结果返回给函数的调用者 print("*****") #不会执行 res = mySum(1, 2) print(res) # 传递参数 值传递:传递的是不可变类型 str\tuple(元组)\number def func1(num1): num = 10 temp = 20 func1(temp) print(temp) 引用传递:传递的是可变类型 list\dict\set是可变的 def func2(lis): lis[0] = 100 li = [1, 3, 2, 3 ] func2(li) print(li) #关键字参数 概念:允许函数调用时给函数的顺序与定义是不一致 def myprint(str, age): print(str, age) myprint(18, "sunck is a goog man") #默认参数 概念:调用函数时,如果没有传递参数,则使用默认参数 # 以后要用默认参数,最好将默认参数放到最后 def myprint(str, age = 18): print(str, age) myprint("sunck is a goog man") #不定长参数 概念:能处理比定义时更多的参数 #加了*号的变量存储所有未命名的变量,如果在函数调用时没有 #指定参数,能处理比定义时更多的参数 def func(name, *arr): print(name) for x in arr: print(x) return x func("sunck","good","nices","handsom") def func2(name, *args): print(name) print(type(args)) for x in range(): pritn(x)
四、匿名参数
概念:不适用def这样的语句定义函数,使用lambda来创建匿名函数
特点:
lambda 只是一个表达式,函数体比def简单
lambda 主体是一个表达式,而不是代码块,仅仅只能在lambda表达式
中封装简单的逻辑
lambda 函数有自己的命令空间,并且不能访问自由参数列表之外的或
全局命名空间的参数
虽然lambda是一个表达式且看起来只能写一行,与c和c++内联函数不同
格式:lambda 参数1, 参数2,……,参数n:expression
sum = lambda num1, num2:num1 + num2 print(sum(1,2))
>>>3
名片
#名片 def display_menu(): print("-"*30) print(" 名片管理系统 V8.0") print("1.添加名片") print("2.删除名片") print("3.修改名片") print("4.查询名片") print("5.获取所有名片信息") print("6.退出系统") print("-"*30) name_list = [] i= 0 while i < 1: # 打印菜单 display_menu() key = get_choice() if key == 1: add_info() elif key == 2: pass elif key == 3: pass elif key == 4: pass elif key == 5: print_all_info(name_list) elif key == 6: pass else: print("输入有误,请重新输入。。。") # 获取用户输入的信息 def get_choice(): selected_key = input("输入要选择的序号:") return int(selected_key) def add_info(): new_name = input("输入姓名:") name_list.append(new_name) def print_all_info(temp_list): print("="*30) for info in temp_list: print(info) print("="*30)
递归
def func(number): if number == 1: result = 1 else: result = func(number - 1)*number return result number = int(input("输入一个正整数:")) a = func(number) print("%d!="%number, a)
7.1 闭包
闭包:有嵌套函数;内部函数对外部函数的变量进行引用;外部函数返回内部函数的函数名
def outer(start = 0): count = [start] def inner(): count[0] += 1 return count[0] return inner quote = outer(5) print(quote())
7.2 装饰器
不改变原函数调用方式,给原函数增添功能
def wrap(func): print("正在装饰") def inner(): print("正在验证权限") func() return inner @wrap def test(): print("test") test()
7.2.2 多个装饰器(调用时顺序自上而下)
def wrap_one(func): def inner(): print("==正在验证权限==") func() return inner def wrap_two(func): def inner(): print("==验证完成==") func() return inner @wrap_one @wrap_two def test(): print("=====test====") test()
7.2.3 装饰器对有参数函数进行修饰
(2个参数)
def wrap(func): print("正在装饰") def inner(a, b): print("验证身份ing") func(a, b) return inner @wrap def test(a, b): # test = wrap(test(a, b)) print("a = %d, b = %d"%(a, b)) test(1, 9)
(参数个数不定)
def wrap(func): print("正在装饰") def inner(*args, **kwargs): print("验证身份ing") func(*args, **kwargs) return inner @wrap def test(*args, **kwargs): # test = wrap(test(a, b)) print("===test===") test(1, 9, 10, 11)
7.2.4 装饰器修饰带有返回值的函数
def wrap(func): print("装饰ing") def inner(): print("验证身份ing") return func() return inner @wrap def test(): return "itheima" result = test() result
7.2.5 带参数的装饰器
(增加一层封装即可)
def wrap(args): def func(func_name): def inner(): print("===验证身份======%s"%(args)) func_name() return inner return func @wrap('hanhan') def test(): print("=====test======") test()
7.3 内置函数
# map() func = lambda x : x+2 result = map(func, [1, 2, 3, 4]) # map()对指定序列做映射 print(list(result)) result = map(lambda x, y: x+y, [1, 2, 3], [2, 3, 4]) # 两个参数,需要传递两个列表 print(list(result))
# filter() # 对指定序列做过滤,返回函数返回值为TRUE的值 func = lambda x: x % 2 result = filter(func, [1, 2, 3, 4, 5]) print(list(result)) # reduce() # 对参数迭代器中的元素进行累积 from functools import reduce func = lambda x, y: x + y result = reduce(func, [1, 2, 3, 4, 5]) # 把每个元素取出,和上次调用后的结果作为参数再次调用函数func(),将最后结果返回给result print(result) result = reduce(lambda x, y: x + y, ['a', 'b'], 'c') # 'c'为默认参数 print(result) # 结果是cab