2018.7.12
day08回顾
集合 set,固定集合frozenset
day09笔记
函数的参数传递
传递方式:
位置传参
序列传参
关键字传参
字典关键字传参
位置传参:
实际参数(实参)的对应关系与形式参数(形参)的对应关系是按位置来依次对应的
示意:
def mymin (a ,b,c):
pass
mymin(1,2,3)
示例:
# 此示例示意位置传参
def myfun1(a, b, c):
# 这是一个函数的传参示例,此函数以后不会改变代码
print('a 的值是:', a)
print('b 的值是:', b)
print('c 的值是:', c)
myfun1(1, 2, 3)
myfun1(4, 5, 6)
说明:
实参和形参通过位置进行传递的匹配
实际参数的个数必须与形式参数的个数相同
序列传参:
序列传参是指在函数调用过程中,用*将序列拆解后按位置进行传递 的传参方式
说明:
序列传参时,序列拆解的位置将于形成一一对应
序列的位置信息对应相应的形参位置
示例见:
# 此示例示意位置传参
def myfun1(a, b, c):
# 这是一个函数的传参示例,此函数以后不会改变代码
print('a 的值是:', a)
print('b 的值是:', b)
print('c 的值是:', c)
s1 = [11, 22, 33]
myfun1(*s1) # 相当于 myfun1(11, 22, 33)
# myfun1(s1[0], s1[1], s1[2])
t1 = (44, 55, 66)
myfun1(*t1)
myfun1(*"ABC")
关键字传参:
关键字传参是指传参时,按着形参的名称给形参赋值
实参和形参按名称进行匹配
示例见:
# 此示例示意位置传参
def myfun1(a, b, c):
# 这是一个函数的传参示例,此函数以后不会改变代码
print('a 的值是:', a)
print('b 的值是:', b)
print('c 的值是:', c)
# 以下是关键传参
myfun1(b=22, c=33, a=11)
myfun1(c=666, b=555, a=444)
字典关键字传参
是指实参为字典,将字典用'**'
拆解后再进行关键字传参的传参方式
示例:
# 此示例示意位置传参
def myfun1(a, b, c):
# 这是一个函数的传参示例,此函数以后不会改变代码
print('a 的值是:', a)
print('b 的值是:', b)
print('c 的值是:', c)
d = {'a': 100, 'b': 200, 'c': 300}
myfun1(**d) # 等同于 myfun1(a=100,b=200,c=300)
# 下是错误做法
# d2 = {'a': 100, 'b': 200, 'c': 300, 'd': 400}
# myfun1(**d2)
说明:
字典的键名和形参名必须一致
字典的键名必须为字符串(标识符)
字典中的键名要在形参中存在
函数的综合传参
函数的传参方式在能确定形参能唯一匹配到相应实参的情况下可以任意组合
说明:
位置传参(序列传参)要在关键字传参(字典关键字传参)的右侧
示例:
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':300, '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) # (11, 33) # <<< 打印元组
xiao, da = minmax(6, 5, 4)
print('最小值:', xiao, '最大值:', da)
t = minmax(2, 1, 3)
print(t)
以下讲函数形参的定义-----------------------
函数的缺省参数:
语法:
def 函数名(形参名=默认参数1,形参名2=默认参数2,...):
语句块
示例见:
def info(name, age=1, address='未填定'):
print('我叫', name, '我今年', age,
'岁, 我家住址:', address)
info("魏明择", 35, "北京市朝阳区")
info("Tarena", 15)
info('张飞')
# info() # 出错
info('小张', age=20)
说明:
缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其右侧的
所有的参数都必须有缺省参数
如:
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
def myadd(a, b, c=0):
return a + b + c
print(myadd(10, 20)) # 30
print(myadd(100, 200, 300)) # 600
2.写一个函数,print_odd,此函数可以传递一个实参,也可以传递两个实参
,当传递一个实参时,代表结束位置,当传递两个实参时,第一个实参代表
起始值,第二个实参代表结束值
打印出以此区间内的全部奇数,不包含结束数:
print_odd(10)#1 3 5 7 9
print_odd(11,20)#11 13 15 17 19
解析:
# 方法1
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()
# 方法二
def print_odd(a, b=None):
if b is None:
start = 1
end = a
else:
start = a
end = b
# 如果开始的偶数,做校正
if start % 2 == 0:
start += 1
for x in range(start, end, 2):
print(x, end=' ')
print()
print_odd(10) # 1 3 5 7 9
print_odd(11, 20) # 11 13 15 17 19
print_odd(10, 20)
print_odd(5, 0)
函数形参的定义方式:
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':
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完全相同
(要求不允许调用max函数)
print(mymax([6, 8, 3, 5])) # 8
print(mymax(100, 200)) # 200
print(mymax(1, 3, 5, 9, 7)) # 9
解析:
def mymax(a, *args):
if len(args) == 0: # 实参个数等于1时
zhuida = a[0]
for x in a:
if x > zhuida:
zhuida = x
return zhuida
else: # 实参个数大于1于时
zhuida = a
for x in args:
if x > zhuida:
zhuida = x
return zhuida
print(mymax([6, 8, 3, 5])) # 8
print(mymax(100, 200)) # 200
print(mymax(1, 3, 5, 9, 7)) # 9
# print(mymax(100)) # 报错
函数的参数说明:
位置形参,缺省参数,星号元组形参,双星号字典形参可以混合使用
函数形参自左至右的顺序为:
位置形参
星号元组形参
命名关键字形参
双星号形参
示例:
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
定义在函数外部,模块内部的变量称为全局变量
全局变量所有函数都可以直接访问(但函数内不能将其直接赋值)
示例:
a = 100
b = 200
def fx(c):
d = 400
a = 100000
print(a, b, c, d)
fx(300)
print("全局内的", a, b)
#100000 200 300 400
#100 200
练习:
创建一个全局变量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) #[...这些是您从键盘输入的数..]
解析:
L = []
def input_number():
while True:
x = int(input("请输入数字: "))
if x == 0:
break
L.append(x)
# 思考:
# def input_number():
# lst = []
# while True:
# x = int(input("请输入数字: "))
# if x == 0:
# break
# lst.append(x)
# L = lst
input_number()
print(L) # [ .... 这些是您从键盘输入的数..]
练习:
1,写一个函数isprime(x)
判断x是否为素数,如果是素数,返回True,否则返回false
def isprime(x):
if x < 2:
return False
# 用排除法判断x 能否被 2, 3, ... x -1 整除
for i in range(2, x):
if x % i == 0:
return False
return True
2,写一个函数prime_m2n(m,n)返回从m开始,到n结束(不包含n)
范围内的素数,返回这些素数的列表并打印
如:
L=prime_m2n(5,10)
print(L) [5,7]
def prime_m2n(m, n):
L = [] # 先准备容器,准备放入数据
for x in range(m, n):
if isprime(x):
L.append(x)
return L
3,写一个函数pimes(n),返回小于n的全部素数的列表,并打印这些素数
如:
L=primes(10)
print(L) #[2,3,5,7]
1)打印100以内的全部素数
2)打印200以内全部素数的和
def primes(n):
return prime_m2n(0, n)
L = primes(10)
print(L) # [2, 3, 5, 7]
# 1) 打印100 以内的全部素数
print(primes(100))
# 2) 打印200 以内的全部素数的和
print(sum(primes(200)))
4,编写函数fn(n) 此函数返回下列级数的和:
fn(n) = 1/(1*2)+1/(2*3)+...+ 1/(n*(n-1)) 的和
def fn(n):
Sn = 0
for i in range(2, n + 1):
Sn += 1 / ((i - 1) * i)
return Sn
print(fn(100))