2018.7.12
day08回顾
集合 set,固定集合frozenset
day09笔记
函数的参数传递
传递方式:
位置传参
序列传参
关键字传参
字典关键字传参
位置传参:
实际参数(实参)的对应关系与形式参数(形参)
的对应关系是按位置来依次对应的
示意:
def mymin (a ,b,c):
pass
mymin(1,2,3)
示例:
def myfun1(a ,b,c):
print(a)
print(b)
print(c)
myfun1(1,2,3)
说明:
实参和形参通过位置进行传递的匹配
实际参数的个数必须与形式参数的个数相同
序列传参:
序列传参是指在函数调用过程中,用*将序列拆解后按位置进行传递
的传参方式
说明:
序列传参时,序列拆解的位置将于形成一一对应
序列的位置信息对应相应的形参位置
示例见:
def myfun1(a ,b,c):
print(a)
print(b)
print(c)
s = [11,22,33]
myfun1(*s) #myfun1(s[0],s[1],s[2])
关键字传参:
关键字传参是指传参时,按着形参的名称给形参赋值
实参和形参按名称进行匹配
示例见:
def myfun1(a ,b,c):
print(a)
print(b)
print(c)
myfun1(b=22,c=33,a=(11)
字典关键字传参
是指实参为字典,将字典用'**'
拆解后再进行关键字传参的传参方式
示例:
def myfun1(a ,b,c):
print(a)
print(b)
print(c)
d = {'a':100,'b':200,'c':300}
myfun1(**d) #等同于myfun1(a=100,b=200,c=300)
说明:
字典的键名和形参名必须一致
字典的键名必须为字符串(标识符)
字典中的键名要在形参中存在
函数的综合传参
函数的传参方式在能确定形参能唯一匹配到相应实参的情况下可以任意组合
说明:
位置传参(序列传参)要在关键字传参(字典关键字传参)的右侧
示例:
def myfun1(a,b,c):
pass
#调用时
myfun1(100,*[200,300]) #正确
myfun1(*(100,200),300) #正确
myfun1(*[100],200,*[300])) #正确
myfun1(100,c=300,b=200) #正确
myfun1(c=300,b=200,100) #错误(位置传参要在关键字传参的右侧)
myfun1(100,**{'c':200,'b':200}) #正确
练习;
写一个函数minmax(a,b,c)
有三个参数,这回这三个参数中的最小值和最大值,
要求,形成元组,最小值在前,最大值在后,如:
def minmax(a,b,c):
zuida=a
if b > zuida:
zuida =b
if c > zuida:
zuida =c
zuixiao=a
if b < zuixiao:
zuixiao =b
if c < zuixiao:
zuixiao =c
return(zuixiao,zuida) #return(min(a,b,c),max(a,b,c))
t = minmax(11,33,22)
print(t)
xiao,da=minmax(6,5,4)
print('最小:',xiao,'最大:',da)
以下讲函数形参的定义-----------------------
函数的缺省参数:
语法:
def 函数名(形参名=默认参数1,形参名2=默认参数2,...):
语句块
示例见:
def info(name,age=1,address='未填写'):
print('我叫',name,'我今年',age,'岁,我家住址:',address)
info('宋清峰',35,'上海')# 我叫 宋清峰 我今年 35 岁,我家住址:
info('宋清峰',35) #我叫 宋清峰 我今年 35 岁,我家住址: 未填写
info('宋清峰') # 我叫 宋清峰 我今年 1 岁,我家住址: 未填写
info() #出错
说明:
缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其右侧的
所有的参数都必须有缺省参数
如:
def fe (a,b=10,c): #错误
pass
练习:
1.写一个函数 myadd
此函数可以计算两个数的和,也可以计算三个数的和
def myadd(a,b=20,c=0):
return a+b+c
print(myadd(10,20)) #30
print(myadd(100,200,300)) #300
2.写一个函数,print_odd,此函数可以传递一个实参,也可以传递两个实参
,当传递一个实参时,代表结束位置,当传递两个实参时,第一个实参代表
起始值,第二个实参代表结束值
打印出以此区间内的全部奇数,不包含结束数:
print_odd(10)#1 3 5 7 9
print_odd(11,20)#11 13 15 17 19
方法一:
def print_odd(a,b=0):
if b ==0:
for x in range(1,a,2):
print(x,end=' ')
else:
print()
else:
if a%2==0: #如果是偶数,就变成奇数
a+=1
for x in range(a,b,2):
print(x,end=' ')
else:
print()
print_odd(10)#1 3 5 7 9
print_odd(11,20)#11 13 15 17 19
函数形参的定义方式:
1,位置形参
2,星号元组形参
3,命名关键词形参
4,双星号字典形参
位置形参:
语法:
def 函数名(形参1,形参2,...):
语句块
星号元组形参:
语法:
def 函数名(*元组形象名):
语句块
作用:
收集多余的位置传参
示例见:
def func(*args):
print('参考个数是:',len(args))
print('args:',args)
func()
func(1,2,3,4)
func(*'abc',1,2,3,None,False)
#参考个数是: 0
#args: ()
#参考个数是: 4
#args: (1, 2, 3, 4)
#参考个数是: 8
#args: ('a', 'b', 'c', 1, 2, 3, None, False)
练习:
写一个函数,
musum可以传入任意个实参的数字,返回所有实参的和
方法一:
def mysum(*args):
return sum(args)
print(mysum(1,2,3,4))#10
print(mysum(10,20,30)) #60
方法二:
def mysum(*args):
s = 0
for x in args:
s+=x
return s
print(mysum(1,2,3,4))#10
print(mysum(10,20,30)) #60
命名关键字形参:
语法:
def 函数名(*,命名关键字形参):
语句块
或
def 函数名(*args,命名关键字形参):
作用:
强制所有的函数都必须关键字传参
示例1:
def fa(*,a,b):
print(a)
print(b)
fa(b=1,a=2)
fa(**{'b':100,'a':200})
示例2:
def fb(*fgd,a,b):
print(fgd)
print(a)
print(b)
fb(1,2,3,4,b=1,a=2)
fb(1,2,'dsd','s',**{'b':200,'a':100})
双星号字典形参
语法:
def 函数名(**字典形参名):
语句块
作用:
收集多余的关键字传参(等号前是字符,切记)
说明:
字典形参名通常命名为'kwargs'
示例见:
def fa(**kwargs):
print('关键词的传参个数',len(kwargs))
print('kwargs=',kwargs)
fa(name='tarena',age=15)
fa(a=1,b='BBB',c=[2,3,4],d=True)
#关键词的传参个数 2
#kwargs= {'age': 15, 'name': 'tarena'}
#关键词的传参个数 4
#kwargs= {'c': [2, 3, 4], 'a': 1, 'd': True, 'b': 'BBB'}
练习:
写一个函数,mymax类似于 内键的函数max
详见:
>>>help(max)
仿照 max 写一信mymax函数,功能与max完全相同
def mymax(a,*args):
if len(args)==0:
zuida=a[0]
#如果len(args)是0,就代表没有,只剩下a,a可以是数字,也可以是列表)
for x in a:
if x > zuida:
zuida=x
return zuida
else: #实参大于1时
zuida = a
for x in args:
if x > zuida:
zuida = x
return zuida
print(mymax([6,8,3,5])) #8
print(mymax(100,200)) #200
print(mymax(1,3,5,9,7)) #9
函数的参数说明:
位置形参,缺省参数,星号元组形参,双星号字典形参可以混合使用
函数形参自左至右的顺序为:
位置形参
星号元组形参
命名关键字形参
双星号形参
示例:
def fx (a,b,*args,c,**kwargs):
pass
fx(100,200,300,400,c='C',d='D',e='E')
函数的不定长参数:
星号元组形参,双星号字典形参
说明:
可以接受任意的位置传参和关键字传参
示例:
def fn(*args,**kwargs):
pass
思考题:
查看>>>help(print)猜想(print)猜想print函数是如何定义的?
全局变量和局部变量
局部变量:
1.定义在函数内部的变量称为局部变量(函数的形参也是局部变量)
2.局部变量只能在函数内部使用
3.局部变量在函数调用时才能够被创建,在函数调用之后会自动销毁
全局变量 global variable
定义在函数外部,模块内部的变量称为全局变量
全局变量所有函数都可以直接访问(但函数内不能将其直接赋值)
示例:
练习:
创建一个全局变量L=[]
写一个函数:
def input_number():
...
此函数每次调用将从键盘读入一些数字输追加到列表L中(列表是列表,变量是变量,局部的
列表不能赋值给外部列表)
L=[]
def input_number():
while True:
n = int(input('输入数字:'))
if n < 0:
break
L.append(n)
input_number()
print(L) #[...这些是您从键盘输入的数..]
练习:
1,写一个函数isprime(x)
判断x是否为素数,如果是素数,返回True,否则返回false
2,写一个函数prime_m2n(m,n)返回从m开始,到n结束(不包含n)
范围内的素数,返回这些素数的列表并打印
如:
L=prime_m2n(5,10)
print(L) [5,7]
3,写一个函数pimes(n),返回小于n的全部素数的列表,并打印这些素数
如:
L=primes(10)
print(L) #[2,3,5,7]
1)打印100以内的全部素数
2)打印200以内全部素数的和
4,编写函数fn(n) 此函数返回下列级数的和:
fn(n) = 1/(1*2)+1/(2*3)+...
day08回顾
集合 set,固定集合frozenset
day09笔记
函数的参数传递
传递方式:
位置传参
序列传参
关键字传参
字典关键字传参
位置传参:
实际参数(实参)的对应关系与形式参数(形参)
的对应关系是按位置来依次对应的
示意:
def mymin (a ,b,c):
pass
mymin(1,2,3)
示例:
def myfun1(a ,b,c):
print(a)
print(b)
print(c)
myfun1(1,2,3)
说明:
实参和形参通过位置进行传递的匹配
实际参数的个数必须与形式参数的个数相同
序列传参:
序列传参是指在函数调用过程中,用*将序列拆解后按位置进行传递
的传参方式
说明:
序列传参时,序列拆解的位置将于形成一一对应
序列的位置信息对应相应的形参位置
示例见:
def myfun1(a ,b,c):
print(a)
print(b)
print(c)
s = [11,22,33]
myfun1(*s) #myfun1(s[0],s[1],s[2])
关键字传参:
关键字传参是指传参时,按着形参的名称给形参赋值
实参和形参按名称进行匹配
示例见:
def myfun1(a ,b,c):
print(a)
print(b)
print(c)
myfun1(b=22,c=33,a=(11)
字典关键字传参
是指实参为字典,将字典用'**'
拆解后再进行关键字传参的传参方式
示例:
def myfun1(a ,b,c):
print(a)
print(b)
print(c)
d = {'a':100,'b':200,'c':300}
myfun1(**d) #等同于myfun1(a=100,b=200,c=300)
说明:
字典的键名和形参名必须一致
字典的键名必须为字符串(标识符)
字典中的键名要在形参中存在
函数的综合传参
函数的传参方式在能确定形参能唯一匹配到相应实参的情况下可以任意组合
说明:
位置传参(序列传参)要在关键字传参(字典关键字传参)的右侧
示例:
def myfun1(a,b,c):
pass
#调用时
myfun1(100,*[200,300]) #正确
myfun1(*(100,200),300) #正确
myfun1(*[100],200,*[300])) #正确
myfun1(100,c=300,b=200) #正确
myfun1(c=300,b=200,100) #错误(位置传参要在关键字传参的右侧)
myfun1(100,**{'c':200,'b':200}) #正确
练习;
写一个函数minmax(a,b,c)
有三个参数,这回这三个参数中的最小值和最大值,
要求,形成元组,最小值在前,最大值在后,如:
def minmax(a,b,c):
zuida=a
if b > zuida:
zuida =b
if c > zuida:
zuida =c
zuixiao=a
if b < zuixiao:
zuixiao =b
if c < zuixiao:
zuixiao =c
return(zuixiao,zuida) #return(min(a,b,c),max(a,b,c))
t = minmax(11,33,22)
print(t)
xiao,da=minmax(6,5,4)
print('最小:',xiao,'最大:',da)
以下讲函数形参的定义-----------------------
函数的缺省参数:
语法:
def 函数名(形参名=默认参数1,形参名2=默认参数2,...):
语句块
示例见:
def info(name,age=1,address='未填写'):
print('我叫',name,'我今年',age,'岁,我家住址:',address)
info('宋清峰',35,'上海')# 我叫 宋清峰 我今年 35 岁,我家住址:
info('宋清峰',35) #我叫 宋清峰 我今年 35 岁,我家住址: 未填写
info('宋清峰') # 我叫 宋清峰 我今年 1 岁,我家住址: 未填写
info() #出错
说明:
缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其右侧的
所有的参数都必须有缺省参数
如:
def fe (a,b=10,c): #错误
pass
练习:
1.写一个函数 myadd
此函数可以计算两个数的和,也可以计算三个数的和
def myadd(a,b=20,c=0):
return a+b+c
print(myadd(10,20)) #30
print(myadd(100,200,300)) #300
2.写一个函数,print_odd,此函数可以传递一个实参,也可以传递两个实参
,当传递一个实参时,代表结束位置,当传递两个实参时,第一个实参代表
起始值,第二个实参代表结束值
打印出以此区间内的全部奇数,不包含结束数:
print_odd(10)#1 3 5 7 9
print_odd(11,20)#11 13 15 17 19
方法一:
def print_odd(a,b=0):
if b ==0:
for x in range(1,a,2):
print(x,end=' ')
else:
print()
else:
if a%2==0: #如果是偶数,就变成奇数
a+=1
for x in range(a,b,2):
print(x,end=' ')
else:
print()
print_odd(10)#1 3 5 7 9
print_odd(11,20)#11 13 15 17 19
函数形参的定义方式:
1,位置形参
2,星号元组形参
3,命名关键词形参
4,双星号字典形参
位置形参:
语法:
def 函数名(形参1,形参2,...):
语句块
星号元组形参:
语法:
def 函数名(*元组形象名):
语句块
作用:
收集多余的位置传参
示例见:
def func(*args):
print('参考个数是:',len(args))
print('args:',args)
func()
func(1,2,3,4)
func(*'abc',1,2,3,None,False)
#参考个数是: 0
#args: ()
#参考个数是: 4
#args: (1, 2, 3, 4)
#参考个数是: 8
#args: ('a', 'b', 'c', 1, 2, 3, None, False)
练习:
写一个函数,
musum可以传入任意个实参的数字,返回所有实参的和
方法一:
def mysum(*args):
return sum(args)
print(mysum(1,2,3,4))#10
print(mysum(10,20,30)) #60
方法二:
def mysum(*args):
s = 0
for x in args:
s+=x
return s
print(mysum(1,2,3,4))#10
print(mysum(10,20,30)) #60
命名关键字形参:
语法:
def 函数名(*,命名关键字形参):
语句块
或
def 函数名(*args,命名关键字形参):
作用:
强制所有的函数都必须关键字传参
示例1:
def fa(*,a,b):
print(a)
print(b)
fa(b=1,a=2)
fa(**{'b':100,'a':200})
示例2:
def fb(*fgd,a,b):
print(fgd)
print(a)
print(b)
fb(1,2,3,4,b=1,a=2)
fb(1,2,'dsd','s',**{'b':200,'a':100})
双星号字典形参
语法:
def 函数名(**字典形参名):
语句块
作用:
收集多余的关键字传参(等号前是字符,切记)
说明:
字典形参名通常命名为'kwargs'
示例见:
def fa(**kwargs):
print('关键词的传参个数',len(kwargs))
print('kwargs=',kwargs)
fa(name='tarena',age=15)
fa(a=1,b='BBB',c=[2,3,4],d=True)
#关键词的传参个数 2
#kwargs= {'age': 15, 'name': 'tarena'}
#关键词的传参个数 4
#kwargs= {'c': [2, 3, 4], 'a': 1, 'd': True, 'b': 'BBB'}
练习:
写一个函数,mymax类似于 内键的函数max
详见:
>>>help(max)
仿照 max 写一信mymax函数,功能与max完全相同
def mymax(a,*args):
if len(args)==0:
zuida=a[0]
#如果len(args)是0,就代表没有,只剩下a,a可以是数字,也可以是列表)
for x in a:
if x > zuida:
zuida=x
return zuida
else: #实参大于1时
zuida = a
for x in args:
if x > zuida:
zuida = x
return zuida
print(mymax([6,8,3,5])) #8
print(mymax(100,200)) #200
print(mymax(1,3,5,9,7)) #9
函数的参数说明:
位置形参,缺省参数,星号元组形参,双星号字典形参可以混合使用
函数形参自左至右的顺序为:
位置形参
星号元组形参
命名关键字形参
双星号形参
示例:
def fx (a,b,*args,c,**kwargs):
pass
fx(100,200,300,400,c='C',d='D',e='E')
函数的不定长参数:
星号元组形参,双星号字典形参
说明:
可以接受任意的位置传参和关键字传参
示例:
def fn(*args,**kwargs):
pass
思考题:
查看>>>help(print)猜想(print)猜想print函数是如何定义的?
全局变量和局部变量
局部变量:
1.定义在函数内部的变量称为局部变量(函数的形参也是局部变量)
2.局部变量只能在函数内部使用
3.局部变量在函数调用时才能够被创建,在函数调用之后会自动销毁
全局变量 global variable
定义在函数外部,模块内部的变量称为全局变量
全局变量所有函数都可以直接访问(但函数内不能将其直接赋值)
示例:
练习:
创建一个全局变量L=[]
写一个函数:
def input_number():
...
此函数每次调用将从键盘读入一些数字输追加到列表L中(列表是列表,变量是变量,局部的
列表不能赋值给外部列表)
L=[]
def input_number():
while True:
n = int(input('输入数字:'))
if n < 0:
break
L.append(n)
input_number()
print(L) #[...这些是您从键盘输入的数..]
练习:
1,写一个函数isprime(x)
判断x是否为素数,如果是素数,返回True,否则返回false
2,写一个函数prime_m2n(m,n)返回从m开始,到n结束(不包含n)
范围内的素数,返回这些素数的列表并打印
如:
L=prime_m2n(5,10)
print(L) [5,7]
3,写一个函数pimes(n),返回小于n的全部素数的列表,并打印这些素数
如:
L=primes(10)
print(L) #[2,3,5,7]
1)打印100以内的全部素数
2)打印200以内全部素数的和
4,编写函数fn(n) 此函数返回下列级数的和:
fn(n) = 1/(1*2)+1/(2*3)+...