问题:
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
defmyadd(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语句)
示例见:
return.py
练习:
1. 写一个函数mymax,实现返回两个数的最大值:
如:
defmymax(a, b):
...<<-- 此处自己实现
print(mymax(100, 200)) # 200
print(mymax("ACB", "ABC")) # ACB
2. 写一个函数input_number
definput_number():
此处自己实现
此函数用来获取用户循环输入的整数,当输入负数时结束输入.
将用户输入的数字以"列表"的形式返回,再用内建函数max, min, sum求出用户输入的最大值,最小值和平均值
L =input_number()
print(L) # 打印用户输入的列表
print("用户输入的最大值是:", max(L))
print("用户输入的最小值是:", min(L))
print("用户输入的平均是:", sum(L)/len(L))
函数的参数传递
传递方式:
位置传参
序列传参
关键字传参
字典关键字传参
位置传参:
实际传递参数(以下简称"实参")与形式参数(形参)的对应关系按位置来依次对应
示例见:
position_give_args.py
序列(列表,元组,字符串,有序的排列)传参:
序列传参是指在函数调用过程中用"*"将序列拆解后按位置进行传递的传参方式
示例见:
sequence_give_args.py
关键字传参:
关键字传参是指传参时,按着形参的"名称"给形参赋值
实参和形参按名称进行匹配
示例见:
keyword_give_args.py
字典关键字传参:
是指实参为字典,将字典用 "**" 拆解后进行关键传参的传参方式
示例见:
dict_keywork_give_args.py
说明:
字典的键名和形参名必须一致
字典的键名必须为字符串(且必须为标识符的规则)
字典的键名要在形参中存在
函数的综合传参:
函数的传参方式在能确定形参能唯一匹配到应当实参的情况下可以任意组合
要求:
位置传参在前,关键字传参在后
示例见:
com_give_args.py
练习:
1. 利用上题input_number获取用户输入的数字列表
写一个函数split_number(L)传入得到的列表
将所有的数字分为奇数和偶数,分别放在两个列表odds 和evens 中
同时返回这两个列表打印其中的数据
defsplit_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. 缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其右侧的所有参数都必须有缺省参数
deffa(a=1, b, c=3): # 是错的
def fb(a,b=10, c): # 是错的
2. 缺省参数可以有0个或多个,甚至全部都是缺参参数
练习:
写一个函数myadd, 此函数可以计算两个数的和,也可以计算三个数的和
defmyadd(.......):
.... 此处自己实现
print(myadd(10, 20)) # 30
print(myadd(100, 200, 300)) # 600
函数形参的定义方式:
位置形参
星号元组形参
命名关键字形参
双星号字典形参
位置形参:
语法:
def 函数名(形参名1, 形参名2, ...):
语句块
星号元组形参:
语法:
def 函数名(*元组形参名):
语句块
作用:
收集多余的位置传参
练习:
写一个函数mysum 可以传入任意个实参,返回所有实参的和
defmysum(*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_star_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. 定义在函数内部的变量称为局部变量(函数的形参也是局部变量)
2. 局部变量只能在函数内部使用
3. 局部变量在函数调用时才能够被创建,在函数调用结束之后会自动销毁
全局变量:
1. 定义在函数外部,模块内部的变量称为全局变量
2. 所有的函数都可以直接访问"全局"变量,但函数内部不能直接通过赋值语句来改变全局变量
示例见:
variable.py
局部变量说明:
1. 在函数内首次对变量赋值是创建局部变量,再次为变量赋值是修改局部变量的绑定关系
2. 在函数内部的赋值语句不会对全局变量造成影响
3. 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个模块同访问
练习:
创建一个全局变量:
L = []
写一个函数:
definput_number():
读入正整数 放到L列表内
# ...... input_number() # 输入1 2 3
print(L) # [1, 2, 3]
# .....input_number() # 输入4,5
print(L) # [1, 2, 3, 4, 5]
globals() 函数和locals 函数
globals() 返回当前全局作用域内变量的字典
locals() 返回当前局部作用域内的变量的字典
示例见:
globals_locals_function.py
函数变量
函数名是变量,它在创建时绑定一个函数
示例见:
function_variable.py
一个函数可以作为另一个函数实参传递
示例:
def f1():
print("f1被调用")
def f2():
print("f2被调用")
def fx(fn):
print("fn绑定的是: ", fn)
fn() # 调用fn绑定的函数,此处等同于调用谁呢?
fx(f1)
fx(f2)
案例:
看懂如下代码做什么事?
defmyinput(fn):
L = []
whileTrue:
x =int(input("请输入大于0的整数:") or '-1')
if x< 0:
break
L.append(x)
returnfn(L) # <<< 注意此处
print(myinput(max))
print(myinput(min))
print(myinput(sum))