初识函数
初识函数
1. 函数的定义
函数的定义:函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。
你已经知道Python提供了许多内建函数,比如print()。
但你也可以自己创建函数,这被叫做用户自定义函数。
2. 函数的结构
1 def 函数名(参数1,参数2): 2 '''函数注释''' 3 函数体代码 4 return 返回值 5 """ 6 1.函数必须先定义后调用 7 2.函数在定义阶段只检测函数体语言 不执行函数体代码 8 3.函数在调用阶段才会执行函数体代码 9 如何调用 10 函数名加括号(如果需要额外的条件则传入额外的条件) 11 """
3. 函数的分类
无参函数 函数在定义阶段括号内没有参数 有参函数 函数在定义阶段括号内有参数 空函数 函数在定义阶段括号内没有参数并且函数体代码为空(pass) def register(): pass def login(): pass '''举个栗子 func_dic = {'1': register, '2': login} while True: print(""" 1.注册 2.登录 """) choice = input('please>>>:').strip() if choice in func_dic: func_name = func_dic.get(choice) func_name() else: print('功能编号不存在') '''
4. 函数的参数
4.1
1 形式参数 2 在函数定义阶段括号内所填写的参数 简称"形参" 3 def func(a, b): 4 pass 5 # a和b就是函数func的形参 6 实际参数 7 在函数调用阶段括号内传入的参数 简称"实参" 8 func(1,2) 9 # 数据1和2就是函数func的实参 10 """ 11 形参与实参的关系 12 我们可以将形参看成是变量名 实参看成是变量值 13 两者在函数调用阶段临时绑定 函数运行结束断开 14 15 形参的表现形式只有一种就是变量名 16 实参的表现形式有很多种(但是把握核心 就是 数据值) 17 """
1 位置参数 2 按照从左往右的顺序依次填入的参数 3 位置形参 4 在函数定义阶段括号内按照从左往右的顺序依次填入的变量名 5 位置实参 6 在函数调用阶段括号内按照从左往右的顺序依次传入的数据值 7 8 # 定义一个可以比较大小的函数(传入两个值 返回较大的) 9 10 11 关键字实参(可以打破位置顺序) 12 在函数调用阶段通过形参名=数据值的形式指名道姓的传值 13 """ 14 1.位置形参与位置实参在函数调用阶段 按照位置一一对应绑定 15 2.位置参数在绑定的时候多一个不行少一个也不行 16 """ 17 18 '''格式越简单的越靠前 格式越复杂的越靠后'''
1 默认参数 2 默认形参 3 函数在定义阶段就可以给形参赋值了 4 1.该形参在函数调用阶段如果不给值 则使用默认的 5 2.该形参在函数调用阶段也可以继续给值 则使用你给的 6 7 # 定义学员注册功能 8 def register(name, age, gender='male'): 9 print('%s:%s:%s' % (name, age, gender)) 10 register('jason', 18) 11 register('tony', 28) 12 register('kevin', 38) 13 register('lili', 18, 'female') 14 register('lili', 18, gender='female') 15 16 """ 17 位置形参与默认值形参在定义的时候 18 位置形参必须在默认值形参的前面 19 """ 20 '''格式越简单的越靠前 格式越复杂的越靠后'''
1 # 1.函数无论传入多少位置参数都可以正常运行 2 # 可变长形参 3 # def func(x,y,*a): 4 # print(x,y,a) 5 # func() # () 6 # func(1) # (1,) 7 # func(1, 2, 3, 4, 5, 6, 7) # (1, 2, 3, 4, 5, 6, 7) 8 # func(1,2) # 1 2 () 9 # func(1,2,3,4,5,6,7,8,9) # 1 2 (3, 4, 5, 6, 7, 8, 9) 10 # func(1,2) # 1 2 (3, 4, 5, 6, 7, 8, 9) 11 """ 12 *号在形参中的使用 13 用于接收多余的位置参数 并组织成元组的形式赋值给*号后面的变量名 14 """ 15 16 17 # 2.函数无论传入多少关键字参数都可以正常运行 18 # def index(x, y, **b): 19 # print(x, y, b) 20 # index() # {} 21 # index(a=1,b=2,c=3,d=4) # {'a': 1, 'b': 2, 'c': 3, 'd': 4} 22 # index(y=2, x=1) # 1 2 {} 23 # index(y=2, x=1, u=222, k=111, l=444) # 1 2 {'u': 222, 'k': 111, 'l': 444} 24 """ 25 **号在形参中的使用 26 用于接收多余的关键字参数 并组织成字典的形式赋值给**号后面的变量名 27 """ 28 # 3.定义一个函数无论传入多少位置参数和关键字参数都可以正常运行 29 # def index(*a,**b): 30 # print(a,b) 31 # index() # () {} 32 # index(1,2,3,4) # (1, 2, 3, 4) {} 33 # index(a=1,b=2,c=3) # () {'a': 1, 'b': 2, 'c': 3} 34 # index(1,2,3,4,a=1,b=2,c=3) # (1, 2, 3, 4) {'a': 1, 'b': 2, 'c': 3} 35 """ 36 墨守成规 37 可变长形参 *与**后面的变量名其实是可以随便定义的 38 但是python中推荐使用 39 *args 40 **kwargs 41 def index(*args, **kwargs): 42 pass 43 """ 44 45 46 # def index(a, b, c): 47 # print(a,b,c) 48 # new_list = [11,22,33] 49 # index(new_list) # 肯定不行 列表是一个整体 相当于一个实参 50 # index(new_list[0],new_list[1],new_list[2]) # 可以 51 '''如果index形参是*args 列表里面有很多元素 如何实现按照位置一一传入''' 52 # def index1(*args): 53 # print(args) 54 # new_list1 = [11,22,33,44,55,66,77,88,99] 55 # index1(*new_list1) # index1(11,22,33,44,55,66,77,88,99) 56 """ 57 *号在实参中的使用 58 会将列表、元组内的元素打散成位置参数的形式一一传值 59 """ 60 61 # def index2(**kwargs): 62 # print(kwargs) 63 new_dict = {'username':'jason','pwd':123} 64 # index2(**new_dict) # index2(username='jason',pwd=123) 65 # {'username': 'jason', 'pwd': 123} 66 """ 67 **号在实参中的使用 68 会将字典内的键值对打散成关键字参数传入 69 """
4.5
1 命名关键字参数 2 def register(name,age,*,sex,height): 3 pass 4 5 # register('jason',18,'male',183) 6 register('lili',18,sex='male',height='1.8m') #正确使用 7 """ 8 sex height在传入实参的时候必须以关键字参数的形式 9 10 ps:该类型的参数几乎不用 也几乎很少能碰到 11 """