问题:
def mysum(a, b):
print(a + b)
r = mysum(100, 200)
print(r) # 请问r绑定的是什么?
# 让mysum返回一个加法的结果:
def mysum(a, b):
result = a + b
r = mysum(100, 200)
print(result) # 打印错误
函数说明:
函数外部无法访问函数内部的局部变量
函数内部可以访问函数外部的变量,但不能修改函数外部变量的绑定关系
例如:
x = 0
def myadd(a, b):
x = a + b
print(x)
r = myadd(100, 200)
print(x) # 0
return 语句
语法:return [表达式]
注: [] 代表内容可省略
作用:用于函数中,结束当前的函数的执行,返回到调用该函数的地方,同时返回表达式的引用关系
说明:
1. return语句后跟的表达式可以省略,省略后相当于return None
2. 如果函数内没有return语句,则函数执行完最后一条语句后返回None(相当于在最后加了一条 return None语句)
练习:
1. 写一个函数mymax,实现返回两个数的最大值:
如:
def mymax(a, b):
... <<-- 此处自己实现
print(mymax(100, 200)) # 200
print(mymax("ACB", "ABC")) # ACB
2. 写一个函数 input_number
def input_number():
此处自己实现
此函数用来获取用户循环输入的整数,当输入负数时结束输入.
将用户输入的数字以"列表"的形式返回,再用内建函数max, min, sum求出用户输入的最大值,最小值和平均值
L = input_number()
print(L) # 打印用户输入的列表
print("用户输入的最大值是:", max(L))
print("用户输入的最小值是:", min(L))
print("用户输入的平均是:", sum(L)/len(L))
函数的参数传递
传递方式:
位置传参
序列传参
关键字传参
字典关键字传参
位置传参:实际传递参数(以下简称"实参")与形式参数(形参)的对应关系按位置来依次对应
序列传参:序列传参是指在函数调用过程中用"*"将序列拆解后按位置进行传递的传参方式
关键字传参:关键字传参是指传参时,按着形参的"名称"给形参赋值,实参和形参按名称进行匹配
字典关键字传参:是指实参为字典,将字典用 "**" 拆解后进行关键传参的传参方式
说明:
字典的键名和形参名必须一致
字典的键名必须为字符串(且必须为标识符的规则)
字典的键名要在形参中存在
函数的综合传参:函数的传参方式在能确定形参能唯一匹配到应当实参的情况下可以任意组合
要求:位置传参在前,关键字传参在后
练习:
1. 利用上题input_number获取用户输入的数字列表写一个函数split_number(L) 传入得到的列表将所有的数字分为奇数和偶数,分别放在两个列表odds 和 evens 中同时返回这两个列表打印其中的数据def split_number(L):
此处自己实现
L = input_number() # 1, 2, 3, 4, 5, 6
t = split_number(L) # 返回一个元组,元组里放两个列表
odds, evens = t
print("所有的奇数是:", odds) # [1, 3, 5]
print("所有的偶数是:", evens) # [2, 4, 6]
函数的传参:
四种:
位置传参
(*序列传参)
关键字传参
(**字典关键字传参)
---------以下讲函数的定义和创建时形参的定义--------
函数的缺省参数
语法:def 函数名(形参名1=默认实参1, 形参名2=默认实参2, ..)
示例见:defualt_args.py
说明:
1. 缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其右侧的所有参数都必须有缺省参数
def fa(a=1, b, c=3): # 是错的
def fb(a, b=10, c): # 是错的
2. 缺省参数可以有0个或多个,甚至全部都是缺参参数
练习:
写一个函数 myadd, 此函数可以计算两个数的和,也可以计算三个数的和def myadd(.......):
.... 此处自己实现
print(myadd(10, 20)) # 30
print(myadd(100, 200, 300)) # 600
函数形参的定义方式:
位置形参
星号元组形参
命名关键字形参
双星号字典形参
位置形参:
语法:
def 函数名(形参名1, 形参名2, ...):
语句块
星号元组形参:
语法:
def 函数名(*元组形参名):
语句块
作用:
收集多余的位置传参
练习:
写一个函数 mysum 可以传入任意个实参,返回所有实参的和
def mysum(*args):
....
print(mysum(1, 2, 3, 4)) # 10
print(mysum(5, 6, 7, 8, 9, 10)) # 45
命名关键字形参
语法:
def 函数名(*, 命名关键字形参):
语句块
或
def 函数名(*args, 命名关键字形参):
语句块
作用:
强制所有的传参都必须用关键字传参
示例见:keywords_args.py
双星号字典形参
语法:
def 函数名(**字典形参名):
语句
作用:
收集多余的关键字传参
示例见:
double_start_keyword_args.py
函数的参数说明:
位置形参, 星号元组形参,命名关键字形参,双星号字典形参,缺省参数可以混合使用
函数参数自左至右的顺序依次为:
位置形参
星号元组形参
命名关键字形参
双星号字典形参
示例:
def fn(a, b, *args, c, d, **kwargs):
pass
fn(1,2,3,4, c=100, d=200, e=300, f=400)
练习:
1. 思考题:
查看:
>>> help(print) 猜想print函数的参数列表是如何定义的????
2. 写一个 myrange函数,参数可以传1~3个,实际意义同range函数规则相同,此函数返回符合range(...) 函数规则的列表
如:
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]
练习:
1. 算出100~999之间的水仙花数(Narcissistic number)水仙花数是指百位的3次方 加上 十位的3次方 加上 个位的3次方等于原数的整数例如:153 等于 1 ** 3 + 5 ** 3 + 3 ** 3建议,先写一个了数is_narcissistic(n) 来判断n是否为水仙花数,如果是返回True, 否则返回False再调用此函数进行判断
2. 求100以内的全部素数(质数) 2 3 5 7 11 ......建议用函数来做两个函数:
def is_prime(x):
'''判断x是否为素数,如果是素数返回True,
否则返回False'''
...
def print_primes(n):
'''此函数打印小于 n的全部素数
print_primes(100) # 开始打印....
3. 将上次的student_info.py改写为两个函数:
1) def input_student():
'''此函数返回用户输入的学生信息的列表
返回的列表格式写之前完全相同
'''
......
2) def output_student(L):
'''此函数把传入的列表L 打印成为表格'''
......
主程序调用:
docs = input_student()
output_student(docs)
print("请再添加几个学生信息...")
docs += input_student()
print("添加之后的学生信息是")
output_student(docs)