函数
函数:将一段具有独立功能的代码块整合到一个整体并命名,在需要的位置调用这个名称即可完成对应需求 *** 作。
→ 可以更高效的实现代码重用
1.函数的定义
def 函数名(参数): 代码1 代码2 ......
2.函数的调用
函数名(参数)
在python中,函数必须先定义后使用
3.需求:封装ATM机功能选项–定义函数
def select_func(): print("---请选择功能---") print("查询余额") print("存款") print("取款") print("---请选择功能---") print("密码正确登录成功") select_func() print("查询余额完毕")
4.函数的参数以及返回值
①需求:一个函数完成两个数的加法运算
def add_num(a,b): result = a + b print(result) add_num(1,2)
② 返回值
def buy(): return '糖' goods = buy() print(f'我买了{goods}')
5.函数的说明文档
查看函数的说明文档
help(函数名) → 查看函数的说明文档
def sum_num(a,b): """求和函数""" return a + b help(sum_num)
6.函数的嵌套调用
→一个函数里面又调用了另外一个函数
def testB(): print('===testB start===') print("这里是函数testB") print("===testB end") def testA(): print("===testA start===") testB() print("===testA end===") testA()
7.函数的简单应用
需求:求三个数的平均值
def sum_num(a,b,c): return a + b + c def average_num(a,b,c): sumResult = sum_num(a,b,c) return sumResult / 3 result = average_num(1,2,3) print(result)
8.函数变量的作用域
主要分为两类:局部变量和全局变量
(1)局部变量
def testA(): a = 100 print(a) testA() print(a)
(2)全局变量
a = 100 def testA(): print(a) def testB(): print(a) testA() testB()
(3)在函数体内部修改全局变量
a = 100 def testA(): print(a) def testB(): global a a += 1 print(a) testA() testB() print(f'全局变量a = {a}')
9.函数的返回值
(1)return会退出当前函数,一个函数中有两个return时,只会执行前一个
(2)一个函数多个返回值
def return_num(): return 1,2,3 result = return_num() print(result)
注意:① 返回多个数据时,默认是元组类型 ② return后可接列表、元组或字典
10.函数的参数
(1)位置参数
def user_info(name,age,gender): print(f'名字是{name},年龄为{age},性别为{gender}') user_info("丁家雄",21,"男")
(2)关键字参数
调用时,通过“键=值”的形式指定,清除了顺序需求
【调用时,如果有位置参数,位置参数必须在关键字参数前,关键字参数之间不存在先后顺序】
def user_info(name,age,gender): print(f'名字是{name},年龄为{age},性别为{gender}') user_info("丁家雄",age = 21,gender= "男") user_info(name="丁家雄",21,"男")
(3)缺省参数(默认参数)
注意:所有位置参数必须在默认参数前,包括函数定义和调用
def user_info(name,age,gender = "男"): print(f"名字是{name},年龄为{age},性别为{gender}") user_info("丁家雄",21)
(4)不定长参数【可变参数】
用于不确定调用的时候会传递多少个参数(可不传)的场景。
① 包裹位置传递【元组】
def user_info(*args): print(args) user_info() user_info("丁家雄",21)
传进的所有参数都被args变量收集,合并为一个元组
② 包裹关键字传递
def user_info(**kwargs): print(kwargs) user_info(name = "丁家雄",age = 21)
返回一个字典
11.拆包和交换变量值
(1)拆包
def return_num(): return 100,200 num1,num2 = return_num() print(num1) print(num2)
(2)交换变量值
#借助第三变量 a = 10 b = 20 print(f'交换前的a为{a},b为{b}') c = 0 c = a a = b b = c print(f'交换后的a为{a},b为{b}') #方法二 a = 10 b = 20 print(f'交换前的a为{a},b为{b}') a,b = b,a print(f'交换后的a为{a},b为{b}')
12.引用
(1)id判断int以及列表
int:(可得int类型为不可变数据类型)
a = 1 b = a print(b) print(f'a的id为{id(a)}') print(f'b的id为{id(b)}') a = 2 print(b) print(f'a的id为{id(a)}') print(f'b的id为{id(b)}')
列表:【列表是可变数据类型】
lista = [10,20] listb = lista print(f'列表a的id为{id(lista)}') print(f'列表b的id为{id(listb)}') lista.append(30) print(listb) print(f'列表a的id为{id(lista)}') print(f'列表b的id为{id(listb)}')
当引用将int当做实参时,id会变化,因为int数据不可变,而列表相反不会变化
13.可变和不可变数据类型
14.学员管理系统
info = [] def print_info(): print("-" * 20) print("欢迎来到学员管理系统") print("1.添加学员") print("2.删除学员") print("3,修改学员信息") print("4.查询学员信息") print("5.显示所有学员信息") print("6.退出系统") print("-" * 20) def add_info(): new_id = input("请输入学号:") new_name = input("请输入姓名:") new_tel = input("请输入手机号:") global info for i in info: if new_name == i['name']: print("该用户已存在!") return info_dict = {} info_dict['id'] = new_id info_dict['name'] = new_name info_dict['tel'] = new_tel info.append(info_dict) print(info) def del_info(): del_name = input("请输入您要删除的学员的名字:") global info for i in info: if del_name == i['name']: info.remove(i) break else: print("该学员不存在") print(info) def modify_info(): modify_name = input("请输入您要修改的学员的姓名:") global info for i in info: if modify_name == i['name']: i['tel'] = input("请输入新的手机号:") break else: print("该学员不存在!") print(info) def search_info(): search_name = input("请输入您要查询的学员的姓名:") global info for i in info: if search_name == i['name']: print("查找到的学员信息如下:") print(f"该学员的学号为{i['id']},姓名是{i['name']},手机号为{i['tel']}") break else: print("该学员不存在!") def print_all(): print("学号t姓名t手机号") for i in info: print(f"{i['id']}t{i['name']}t{i['tel']}") while True: print_info() user_num = input("请选择您需要的功能序号:") if user_num == '1': add_info() elif user_num == '2': del_info() elif user_num == "3": modify_info() elif user_num == "4": search_info() elif user_num == "5": print_all() elif user_num == "6": exit_flag = input("确定要退出吗?yes or no") if exit_flag == 'yes': break else: print("输入错误,请重新输入")
15.递归
特点:函数自己调用自己;必须有出口
需求:3以内数字累加和
def sum_numbers(num): if num == 1: return 1 return num + sum_numbers(num - 1) sum_result = sum_numbers(3) print(sum_result)
16.lambda表达式
如果函数有一个返回值,并且只有一句执行代码,可以用lambda简化
lambda表达式的参数可有可⽆,函数的参数在lambda表达式中完全适⽤。
lambda表达式能接收任何数量的参数但只能返回⼀个表达式的值。
(1)lambda函数实现
def fn1(): return 200 print(fn1) print(fn1()) fn2 = lambda : 100 print(fn2) print(fn2())
(2)计算a+b
fn1 = lambda a,b : a + b print(fn1(1,2))
(3)lambda的参数形式
①无参数
②一个参数
③ 默认参数
④ 可变参数*args
⑤ 可变参数 **kwargs
fn1 = lambda : 100 print(fn1()) fn2 = lambda a : a print(fn2("丁家雄")) fn3 = lambda a,b,c = 100 : a + b + c print(fn3(1,2)) fn4 = lambda *args : args print(fn4(1,2,3,4)) fn5 = lambda **kwargs : kwargs print(fn5(name = '丁家雄',age = 21))
(4)带判断的lambda
fn1 = lambda a,b : a if a > b else b print(fn1(100,200))
(5)列表数据按字典key值排序
students = [ {'name':"丁",'age':21}, {'name':'王','age':21}, {'name':'小丁','age':0} ] #按name值升序排列 students.sort(key = lambda x : x['name']) print(students) #按name值降序排列 students.sort(key = lambda x : x['name'],reverse=True) print(students) #按age值升序排列 students.sort(key = lambda x : x['age']) print(students)
17.高阶函数
将函数作为参数传入,这样的函数称为高阶函数
def sum_num(a,b,f): return f(a) + f(b) result = sum_num(-1,2,abs) print(result)
18.内置高阶函数
(1)map(func,lst)
将传⼊的函数变量func作⽤到lst变量的每个元素中,并将结果组成新的列表(Python2)/迭代器(Python3)返回。
需求:计算列表序列中各个数字的3次方
list1 = [1,2,3,4,5] def func(x): return x ** 3 result = map(func,list1) print(result) print(list(result))
(2)reduce(func,lst)
其中func必须有两个参数。每次func计算的结果继续和序列的下⼀个元素做累积计
算。
reduce()传入的参数func必须接收2个参数
import functools list1 = [1,2,3,4,5] def func(a,b): return a + b result = functools.reduce(func,list1) print(result)
(3)filter()
filter(func, lst)函数⽤于过滤序列, 过滤掉不符合条件的元素, 返回⼀个 filter 对象。如果要转换为列表,可以使⽤ list() 来转换。
list1 = [i for i in range(1,11)] def func(x): return x % 2 == 0 result = filter(func,list1) print(result) print(list(result))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)