9.python(第九天日记)
初识函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print(),len()等。但你也可以自己创建函数,这被叫做用户自定义函数。
1.函数定义:
1>定义,使用函数
1. def 关键字,定义一个函数。
2. 函数名与变量命命名规则一样
3. def与函数名之间有一个空格
4. 函数名之后+括号和冒号
注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以增强代码的可读性。
结论:函数的使用,必须遵循原则:先定义,后调用。我们在使用函数时,一定要明确地区分定义阶段和调用阶段
调用:就是 函数名() 加上括号。
5.函数定义阶段:只检测语法,不执行代码
注释:也就说,语法错误在函数定义阶段就会检测出来,而代码的逻辑错误只有在执行时才会知道
2>函数分类
1.有参
def tell_tag(tag,n): #有参数 print(tag*n)
#调用阶段
tell_tag('*',12)
注释:定义时有参,意味着调用时则必须传入参数
2.无参
def tell_msg(): #无参数 print('hello world')
#调用阶段
tell_msg()
注释:定义时无参,意味着调用时也无需传入参数
3.空
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def auth(user,password): ''' auth function :param user: 用户名 :param password: 密码 :return: 认证结果 ''' pass def get(filename): ''' :param filename: :return: ''' pass def put(filename): ''' :param filename: :return: ''' def ls(dirname): ''' :param dirname: :return: ''' pass #程序的体系结构立见 空函数
3>调用函数:函数名之后+括号
1 先找到名字
2 根据名字调用代码
3 函数调用的3种形式:
1 语句形式:foo()
2 表达式形式:3*len('hello')
3 当中另外一个函数的参数:range(len('hello'))
2.函数的返回值:
1.在函数中遇到return终断函数
2.将值返回给函数的调用者注释:
什么时候该有返回值?
调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值。通常有参函数需要有返回值,输入参数,经过计算,得到一个最终的结果
什么时候不需要有返回值?
调用函数,仅仅只是执行一系列的操作,最后不需要得到什么结果,则无需有返回值。通常无参函数不需要有返回值
返回值:
1.return后面没有返回值
def my_len(): st = 'abcd' count = 0 for i in st: count += 1 return print(my_len())
>>>None
2.return返回值是None
def my_len(): st = 'abcd' count = 0 for i in st: count += 1 return None print(my_len())
>>>None
3.return 1个值,该值是什么,就直接返回给函数的调用者,函数名()
def my_len(): st = 'abcd' count = 0 for i in st: count += 1 return 123 print(my_len())
>>>123
4.return 多个值,将多个值放到一个元组里,返回给函数的调用者。
def my_len(): st = 'abcd' count = 0 for i in st: count += 1 return 1,2,3 print(my_len())
>>>(1,2,3)
5.return 多个值,用多个值接收。
def my_len(): st = 'abcd' count = 0 for i in st: count += 1 return 1,2,3 a,b,c = my_len() print(a,b,c)
>>>1,2,3
3.函数的传参
注释:形参即变量名,实参即变量值,函数调用时,将值绑定到变量名上,函数调用结束,解除绑定
a = input('请输入: ') def my_len(s): count = 0 for i in s: count += 1 return count print(my_len(a))
1.实参:我们调用函数时传递的这个 a 被称为实际参数,因为这个是实际的要交给函数的内容,简称实参
1.按照位置传值
def max_min(x,y): the_max = x if x > y else y #三元运算(三元:x,y,the_max) return the_max ma = max_min(10,20) print(ma)
2.按照关键字传值
def max_min(x, y): the_max = x if x > y else y return the_max ma = max_min(y = 10,x = 20) print(ma)
3.混合传参
def max_min(x, y): the_max = x if x > y else y return the_max ma = max_min(10,y = 20) print(ma)
注释:1:位置参数必须在关键字参数的前面
2:对于一个形参只能赋值一次
2.形参:定义函数时的s,只是一个变量的名字,被称为形式参数,因为在定义函数的时候它只是一个形式,表示这里有一个参数,简称形参。
1.按照位置传值
def max_min(x,y): the_max = x if x > y else y #三元运算(三元:x,y,the_max) return the_max ma = max_min(10,20) print(ma)
2.默认参数 #方法:将变化比较小的值设置成默认参数
def Infor_entry(username, sex='男'): with open('name_list', encoding='utf-8', mode='a') as f1: f1.write('{}\t{}\n'.format(username, sex)) while True: username = input('请输入姓名(男生以1开头)').strip() if '1' in username: username = username[1:] Infor_entry(username) else: Infor_entry(username, '女')
3.动态参数(万能参数)
*args接受的就是实参对应的 所有位置参数,并将其放在元组中。
形参对应顺序:位置参数 ------> *args ------> 默认参数
**kwargs 动态传参,他将所有的关键字参数(无意义的)放到一个字典中。
形参角度终顺序:位置参数------> *args ------> 默认参数 ------> **kwargs
def foo(x,y,*args): print(x,y) print(args) foo(1,2,3,4,5) def foo(x,y,*args): print(x,y) print(args) foo(1,2,*[3,4,5]) def foo(x,y,z): print(x,y,z) foo(*[1,2,3])
def foo(x,y,**kwargs): print(x,y) print(kwargs) foo(1,y=2,a=1,b=2,c=3) def foo(x,y,**kwargs): print(x,y) print(kwargs) foo(1,y=2,**{'a':1,'b':2,'c':3}) def foo(x,y,z): print(x,y,z) foo(**{'z':1,'x':2,'y':3})
def foo(x,y): print(x,y) def wrapper(*args,**kwargs): print('====>') foo(*args,**kwargs)
4.*的魔法应用:
在函数的执行(调用)时:打散。
*可迭代对象(str,tuple,list,dict(key))每一个元素添加到args元组中。
**dict 将字典的键值对添加到kwargs字典中.
def func(*args,**kwargs): args = (1,2,3,4) # kwargs = {'age': 56, 'name': '老男孩'} print(*args) # print(**kwargs) #(age = 56 ,name = 老男孩) dic1 = {'name1':'alex','age1':46} dic2 = {'name':'老男孩','age':56} func(*[1,2,3,4],*'asdfsad',**dic1,**dic2) func(**dic2)
函数的定义时: 聚合。
*args将所有的位置参数聚合到一个元组中。
**kwargs 将所有的关键字参数聚合到一个字典中。
def func(*args,**kwargs): print(args) print(kwargs) dic1 = {'name1':'alex','age1':46} dic2 = {'name':'老男孩','age':56} func(*[1,2,3,4],*'asdfsad',**dic1,**dic2)