1、函数 function
什么是函数:函数是可以重复执行的语句块,可以重复调用;
作用:
用于封装语句,提高代码的重用性
用于定义(创建)用户级别的函数
语法:
def 函数名(形参列表):
语句块
说明:
1、函数的名字就是语句块的名称;
2、函数名的命名规则与变量名相同(函数名必须是标识符(字母或下划线开头));
3、函数名是一个变量;
4、函数有自己的名字空间,在函数外部不可以访问函数内部的变量,在函数内部可以访问函数外部的变量,要让函数处理外部数据需要用参数给函数传入一些数据;
5、参数列表 可以为空;
6、语句部分不能为空,如果为空需要用pass语句填充;
2、函数调用:
函数名(实际调用传递参数,简称实参)
说明:
函数调用是一个表达式;
如果没有return语句,函数执行完毕后返回None对象;
如果函数需要返回其它的对象需要用到return语句;
3、函数说明:
函数外部无法访问函数内部的局部变量;
函数内部可以访问函数外部的变量,但不能修改函数外部变量的绑定关系;
示例: x = 0 def myadd(a,b): x = a + b print(x) #结果为300 myadd(100, 200) print(x) # 结果为0
4、return 语句:
语法:
return [表达式]
注:[] 代表内容可省略
作用: 结束函数的执行,返回到调用函数位置!
只用于函数中,结束当前的函数的执行,返回到调用该函数的位置 ,同时返回表达式的引用关系;
说明:
1、return 语句后跟的表达式可以省略,省略后相当于return None;
2、如果函数内没有return语句,则函数执行完最后一条语句后返回None(相当于在最后加了一条return None语句);
示例: def say_hello(): print('1') print('2') return print('3') say_hello() say_hello() #注意:这里函数调用返回的结果是1 ,2, 1,2;函数内看到return语句表示结束当前的函数执行,返回调用该函数位置。
5、函数的参数传递:
传递方式:
位置传参
序列传参
关键字传参
字典关键字传参
5.1、位置传参:
实际传递参数(以下简称实参)与形式参数(形参)的对应关系按位置来依次对应;
示例: position_give_args.py def myfun(a, b, c): print('a=', a) print('b=', b) print('c=', c) myfun(1, 2, 3)
5.2、序列传参:(归属位置传参)
序列传参是指在函数调用过程中用“*”将序列拆解后按位置进行传递的传参方式;
示例:sequence_give_args.py def myfun(a, b, c): print('a=', a) print('b=', b) print('c=', c) s = "ABC" L = [4,5,6] t = (1.1, 2.2, 3,3) myfun(*s) #字符串序列传参 myfun(*L) #列表序列传参 myfun(*t) #元组序列传参
5.3、关键字传参:
关键字传参是指传参时,按着形参的“名称”给形参赋值,实参和形参按名称进行匹配;
示例:#keyword_give_args.py def myfun(a, b, c): print('a=', a) print('b=', b) print('c=', c) myfun(b=2, c=3, a=1)
5.4、字典关键字传参:(归属关键字传参)
是指实参为字典,将字典用“**” 拆解后进行关键字传参的传参方式;
示例:dict_keyword_give_args.py def myfun(a, b, c): print('a=', a) print('b=', b) print('c=', c) d = {'a':111, 'c':333, 'b':222} myfun(**d)
说明:字典的键名和形参名必须一致;
字典的键名必须为字符串(且必须为标识符的规则);
字典的键名要在形参中存在;
5.5、函数的综合传参:
函数的传参方式在能确定形参 能唯一匹配到对应实参的情况下可以任意组合;
要求:
位置传参在前,关键字传参在后!
示例:com_give_args.py def myfun(a, b, c): print('a=', a) print('b=', b) print('c=', c) myfun(1,c = 3, b = 2) myfun(100, *[200, 300]) myfun(*"AB", 300) myfun(*"AB", **{'c':300})
6、函数的缺省参数
语法:
def 函数名(形参名1=默认实参1,形参名2=默认实参2,....)
说明:
缺省参数必须自右至左依次存在,如果一个参数 有缺省参数,则其右侧的所有参数都必须有缺省参数;
def fa(a=1, b, c=3): #是错误的
缺省参数可以有0个或多个,甚至全部都是缺省参数;
示例:#defualt_args.py def info(name, age=1,address="未填写"): print(name,'今年',age,'岁,住在:', address) info('小李') info('小李', age=20) info('小李', age=20,address='重庆') info('小李', 33, '重庆市大竹林')
7、函数形参的定义方式:
位置形参
星号元组形参
命名关键字形参
双星号字典形参
7.1、位置形参:
语法:
def 函数名(形参名1,形参名2,...):
语句块
7.2、星号元组形参:
语法:
def 函数名(*元组形参名):
语句块
作用:收集多余位置传参
print("示例见:#star_tuple_args.py") #星号元组形参 def fb(*args): '''args绑定一个元组''' print('实参个数是:', len(args)) print("args:", args) fb() fb(1,2,3,4)
7.3、命名关键字形参:
语法:
def 函数名(*,命名关键字形参):
语句块
或
def 函数名(*args,命名关键字形参):
语句块
作用: 强制*后所有的传参都必须用关键字传参
示例:#keywords_args.py def fa(a, b, *, c, d): '''强制c,d必须用关键字传参''' print(a, b, c, d) # fa(1,2,3,4) #错的 fa(1,2, c=3, d=4) fa(1,2, d=400, c=300) def fb(a, b, *args, c, d): '''强制c,d必须用关键字传参''' print(a, b, args,c, d) # fb(1,2,3,4,5,d=400,c=200) #1 2 (3, 4, 5) 200 400 fb(1,2,3,4,5,**{'d':400,'c':300}) #1 2 (3, 4, 5) 300 400
7.4、双星号字典形参:
语法:
def 函数名(**字典形参名):
语句
作用: 收集多余的关键字传参
示例:#double_start_keyword_args.py def fa(**kwargs): '''kwargs绑定字典''' print("多余的关键字传参的个数是:", len(kwargs)) print("kwargs =", kwargs) # fa(a=10, b=20, c=30) #kwargs = {'a': 10, 'b': 20, 'c': 30} def fb(*args, a, **kwargs): print(args, a, kwargs) fb(1,2,3,4,5, a=10, b=30, c=40) #(1, 2, 3, 4, 5) 10 {'b': 30, 'c': 40}
函数的参数说明:
位置形参,星号元组形参,命名关键字形参,双星号字典形参,缺省参数可以混合使用;
函数参数自左至 的顺序依次为:
位置形参
星号元组形参
命名关键字形参
双星号字典形参
示例: def fn(a, b, *args, c, d, **kwargs): print(a, b, args, c, d, kwargs) fn(1,2,3,4, c=100, d=200, e=300, f=400) #1 2 (3, 4) 100 200 {'e': 300, 'f': 400} #1.思考题 #查看>>>help(print) #猜想print函数的参数列表是如何定义的? def myprint(*args, sep=' ', end=' ') L = [str(x) for x in args] #把所有元组元素转为字符串列表 s = sep.join(L) #把列表中字符串以sep变量字符串连接成字符串,赋值给s s += end print(s, end='') #方法二 def pyprint1(*args, sep=' ', end=' '): print(*args, sep=sep, end=end) #直接调用print函数,传参 # myprint(1,2,3,4,5) myprint('hello','world',sep='#') myprint(1,2,3,4, sep=':', end='我是结尾 ') #2..思考题写一个myrange函数,参数可以传入1-3个,实际意义同range函数规则相同,此函数返回符合range(。。。)函数规则的列表 def myrange(start,stop=None,step=1): r_lst =[] #即将返回的列表 #调整三个形参的值 if stop is None: stop = start start = 0 if step > 0: while start < stop: r_lst.append(start) #把当前数加入到列表中 start += step #让start向后移动,准备下次操作 else: #当步长小于0的情况,倒序 for x in range(start,stop,step): r_lst.append(x) return r_lst # L = myrange(4) print(L) #[0,1,2,3] L = myrange(4,6) print(L) #[4,5] L = myrange(1,10,3) print(L) #[1,4,7] L = myrange(10,1,-2) print(L)
print('1.题---------------') #练习 #1. 算出 100-999之间的水仙花数(narcissistic number) # 水仙花数是指百位的3次方,加上十位的3次方,加上个位的3次方等于原数的整数 # 例如 153 = 1 ** 3 + 5 ** 3 + 3 ** 3 # 建议先写一个函数is_narcissistic(n)来判断n是否为水仙花数,如果是返回True,否则返回False # 再调用些函数进行判断 def is_narcissistic(n): L = list(str(n)) jisuan = int(L[0]) ** 3 + int(L[1]) ** 3 + int(L[2]) ** 3 if jisuan == n: return True else: return False # #n = int(input('请输入三位整数:')) #print('判断', n, '是否为水仙花数,结果', is_narcissistic(n)) print('水仙花数为:') for x in range(100,1000): if is_narcissistic(x): print(x, end=' ') else: print() print(' ') print('2.题---------------') #2. 求100以内的全部素数(质数) # 2,3,5,7,11.......... #建议用函数来做 #两个函数 # def is_prime(x): # 判断 x是否是素数,是返回true ,否返回False # def print_primes(n): # 此函数打印小于n的全部素数 # print_primes(100)开始打印 #定义判断质数函数,是返回true,不是返回false def is_prime(x): if x < 2: return False for i in range(2, x): if x % i == 0: return False return True def print_primes(n): print('小于',n,'的全部素数:',end=' ') for i in range(n): #调用函数判断i是否是素数 if is_prime(i): print(i, end=' ') else: print() print_primes(100) print(' ') #3.将上次的student_info.py改写为两个函数: #1) def input_student(): #2) def output_student(L): # 主程序调用: # docs = input_student() # output_student(docs) # print(请再添加几个学生信息..) # docs += input_student() #print(添加之后的学生信息是) #output_student(docs) def input_student(): lst = [] #定义空列表 #定义循环读入学生信息 while True: student_name = input('请输入学生姓名:') #判断输入学生姓名为空结束输入 if not student_name: break student_age = int(input('请输入学生年龄:')) student_score = int(input('请输入学生成绩:')) student_dict = {} #定义新空字典,用于存放学生信息 student_dict['name'] = student_name student_dict['age'] = student_age student_dict['score'] = student_score #将字典使用append方法,存入到L列表中,注意这此处未改变L全局变量的绑定关系 lst.append(student_dict) #print('打印列表lst信息: ',lst) return lst def output_student(L): #显示学生信息列标头 print('+','-' * 20,'+','-' * 10,'+','-' * 12, '+') print('|', 'name'.center(20),'|','age'.center(10), '|', 'score'.center(12), '|') print('+','-' * 20,'+','-' * 10,'+','-' * 12, '+') #此处打印所有学生的信息 #把学生的数据取出来,用k绑定对应的字典 for k in L: #将姓名格式变成20宽度居中的字符串 center_name = k['name'].center(22) #先将年龄转换为字符串 str_age = str(k['age']) center_age = str_age.center(12) str_score = str(k['score']) center_score = str_score.center(14) #print('|',center_name, '|', center_age, '|', center_score, '|') line = "|%s|%s|%s|" % (center_name, center_age, center_score) print(line) print('+','-' * 20,'+','-' * 10,'+','-' * 12, '+') def main(): docs = input_student() output_student(docs) print('请再添加几个学生信息..') docs += input_student() print('添加之后的学生信息是') output_student(docs) main