18
1、分清楚形参和实参
2、函数文档:是函数的一部分,于解释不同,使用help(函数名)或者 函数名__doc__可以查看到
3、关键字参数(在一个函数的参数较多的时候作用比较明显):
给参数的名字下定义,例如:
def F(name,words)
如下两种引用的方法是等价的
F(A,B) = F(words=B,name=A)
4、默认参数:函数定义时为形参赋初值,函数调用时若没有传递参数,则自动使用初值
def F(name=C,words=D)
5、收集参数:
>>> def test (*params):
print('参数的长度是:',len(params))
print('第二个参数是:',params[1])
>>> test('1','isabel',2,3,4,6,7)
参数的长度是: 7
第二个参数是: isabel
怎样理解:将'1','isabel',2,3,4,6,7视为一个元组传入params
注意:这种情况下传递多个参数容易混淆,因此有必要使用关键字参数
错误情况:
>>> def test (*params,exp):
print('参数的长度是:',len(params))
print('第二个参数是:',params[1])
>>> test('1','isabel',2,3,4,6,7,8)
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
test('1','isabel',2,3,4,6,7,8)
TypeError: test() missing 1 required keyword-only argument: 'exp'
如何改正:
>>> def test (*params,exp=8):
print('参数的长度是:',len(params))
print('第二个参数是:',params[1])
>>> test('1','isabel',2,3,4,6,7)
参数的长度是: 7
第二个参数是: isabel
>>> def test (*params,exp=8):
print('参数的长度是:',len(params),exp)
print('第二个参数是:',params[1])
>>>
>>> test('1','isabel',2,3,4,6,7,8)
参数的长度是: 8 8
第二个参数是: isabel
测试题:
0. 请问以下哪个是形参哪个是实参?
def MyFun(x):
return x ** 3
y = 3
print(MyFun(y))
x是形参,y是实参。形参指的是函数创建和定义过程中小括号里的参数,而实参指的是函数在调用过程中传递进去的参数。
1. 函数文档和直接用“#”为函数写注释有什么不同?
给函数写文档是为了让别人可以更好的理解你的函数,所以这是一个好习惯:
def MyFirstFunction(name):
'函数文档在函数定义的最开头部分,用不记名字符串表示'
print('I love FishC.com!')
我们看到在函数开头写下的字符串Ta是不会打印出来的,但Ta会作为函数的一部分存储起来,这个我们称之为函数文档字符串,Ta的功能跟注释是一样的。
函数的文档字符串可以按如下方式访问:
>>> MyFirstFunction.__doc__ #双低线
'函数文档在函数定义的最开头部分,用不记名字符串表示'
另外,我们用help()来访问这个函数也可以看到这个文档字符串:
>>> help(MyFirstFunction)
Help on function MyFirstFunction in module __main__:
MyFirstFunction(name)
函数文档在函数定义的最开头部分,用不记名字符串表示
2. 使用关键字参数,可以有效避免什么问题的出现呢?
关键字参数,是指函数在调用的时候,带上参数的名字去指定具体调用的是哪个参数,从而可以不用按照参数的顺序调用函数
3. 使用help(print)查看print()这个BIF有哪些默认参数?分别起到什么作用?
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
4. 默认参数和关键字参数表面最大的区别是什么?
默认参数是赋予形式参数默认值,关键字参数是使得实际参数与形参相对应而避免顺序错误引发的系统报错。
关键字参数是在函数调用的时候,通过参数名制定需要赋值的参数,这样做就不怕因为搞不清参数的顺序而导致函数调用出错。而默认参数是在参数定义的过程中,为形参赋初值,当函数调用的时候,不传递实参,则默认使用形参的初始值代替
动动手:
0. 编写一个符合以下要求的函数:
a) 计算打印所有参数的和乘以基数(base=3)的结果
b) 如果参数中最后一个参数为(base=5),则设定基数为5,基数不参与求和计算。
不会:
def Sum(*params,base=3):
result = 0
for i in params:
result += i
return result*base
1. 寻找水仙花数
题目要求:如果一个3位数等于其各位数字的立方和,则称这个数为水仙花数。例如153 = 1^3+5^3+3^3,因此153是一个水仙花数。编写一个程序,找出所有的水仙花数。
小甲鱼:
def Daffodils(): print('所有的水仙花数为:',end='') temp = 100 while temp < 1000: if temp == (temp//100)**3 + ((temp%100)//10)**3 + (temp%10)**3: print(temp,end=' ') temp += 1 else: temp += 1 print(Daffodils())
. 编写一个函数findstr(),该函数统计一个长度为2的子字符串在另一个字符串中出现的次数。例如:假定输入的字符串为"You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.",子字符串为"im",函数执行后打印“子字母串在目标字符串中共出现3次”。
程序执行效果:
小甲鱼:
def findStr(desStr, subStr): count = 0 length = len(desStr) if subStr not in desStr: print('在目标字符串中未找到字符串!') else: for each1 in range(length): if desStr[each1] == subStr[0]: if desStr[each1 + 1] == subStr[1]: count += 1 print('子字符串在目标字符串中共出现 %d 次' % count) desStr = input('请输入目标字符串:') subStr = input('请输入子字符串(两个字符):') findStr(desStr, subStr)
18
1、函数与过程:过程(procedure)是简单的,特殊且没有返回值的;函数(Function)有返回值
Python严格来说只有函数没有过程
2、局部变量:在局部生效如在函数中定义的变量//函数内部
3、全局变量:作用于整个模块//函数外部
函数内若试图修改全局变量,Python会新建一个同名局部变量用于存储修改值,原全局变量的值不变
测试题:
0. 下边程序会输入什么?
def next():
print('我在next()函数里...')
pre()
def pre():
print('我在pre()函数里...')
next()
我在next()函数里...
我在pre()函数里...
1. 请问以下这个函数有返回值吗?
def hello():
print('Hello FishC!')
有。 会返回一个None的对象
如果没有使用return语句指定返回值,Python也不是什么都不返回的,Ta会返回一个None对象,所以我们说Python所有的函数都有返回值。
2. 请问Python的return语句可以返回多个不同类型的值吗?
可以,默认用逗号隔开,是以元祖的形式返回,你当然也可以用列表包含起来返回
3. 目测以下程序会打印什么内容:
def fun(var): var = 1314 print(var, end='') var = 520 fun(var) print(var) 1314520 4. 目测以下程序会打印什么内容?
var = ' Hi ' def fun1(): global var var = ' Baby ' return fun2(var) def fun2(var): var += 'I love you' fun3(var) return var def fun3(var): var = ' 小甲鱼 ' print(fun1()) Baby I love you
- 小甲鱼建议不到万不得已不要使用全局变量,简洁的概括为:
a) 代码可读性变差
b) 代码安全性降低
以下关于全局变量的危言耸听是转来的,大家不妨也看下:
a) 它会造成不必要的常量频繁使用,特别当这个常量没有用宏定义“正名”时,代码阅读起来将万分吃力。
b) 它会导致软件分层的不合理,全局变量相当于一条快捷通道,它容易使程序员模糊了“设备层”和“应用层”之间的边界。写出来的底层程序容易自作多情地关注起上层的应用。这在软件系统的构建初期的确效率很高,功能调试进度一日千里,但到了后期往往bug一堆,处处“补丁”,雷区遍布。说是度日如年举步维艰也不为过。
c) 由于软件的分层不合理,到了后期维护,哪怕仅是增加修改删除小功能,往往要从上到下掘地三尺地修改,涉及大多数模块,而原有的代码注释却忘了更新修改,这个时候,交给后来维护者的系统会越来越像一个“泥潭”,注释的唯一作用只是使泥潭上方再加一些迷烟瘴气。
d) 全局变量大量使用,少不了有些变量流连忘返于中断与主回圈程序之间。这个时候如果处理不当,系统的bug就是随机出现的,无规律的,这时候初步显示出病入膏肓的特征来了,没有大牛来力挽狂澜,注定慢性死亡。
e) 无需多言,如果您的系统中大量使用全局变量,那么您已经成功得到一个畸形的系统,它处于一个神秘的稳定状态!你看着这台机器,机器也看着你,相对无言,心中发毛。你不确定它什么时候会崩溃,也不晓得下一次投诉什么时候道理。
1. 编写一个函数,分别统计出传入字符串参数(可能不只一个参数)的英文字母、空格、数字和其它字符的个数。
我的答案:
>>> def count (*str):
num=-1
for i in str:
num+=1
count1=0
count2=0
count3=0
count4=0
for j in str[num]:
if ((j>='a')and(j<='z'))or((j>='A')and(j<='Z')):
count1+=1
else:
if j>='0'and j<='9':
count2+=1
else:
if j==' ':
count3+=1
else:
count4+=1
print('第',num+1,'个字符串共有:英文字母',count1,'个,数字',count2,'个,空格',count3,'个,其他字符',count4,'个。','\n')
>>> count('I love fishc.com.','I love you, you love me.')
第 1 个字符串共有:英文字母 13 个,数字 0 个,空格 2 个,其他字符 2 个。
第 2 个字符串共有:英文字母 17 个,数字 0 个,空格 5 个,其他字符 2 个。
小甲鱼答案:
>>> def count(*param):
length = len(param)
for i in range(length):
word = 0
num = 0
spa = 0
oth = 0
for j in param[i]:
if j.isalpha():
word += 1
elif j.isspace():
spa += 1
elif j.isdigit():
num += 1
else:
oth += 1
print ('第 %d 个字符串共有:英文字母 %d 个,数字 %d 个,空格 %d 个,其他字符 %d 个'
%(i+1,word,num,spa,oth))
>>> count('I love fishc.com.','I love you, you love me.')
第 1 个字符串共有:英文字母 13 个,数字 0 个,空格 2 个,其他字符 2 个
第 2 个字符串共有:英文字母 17 个,数字 0 个,空格 5 个,其他字符 2 个