使用如下方法,可以使函数接受不定数目的参数:
def add(x, *args):
total = x
for arg in args:
total += arg
return total
这样定义的函数不能使用关键词传入参数,要使用关键词,可以这样:
def add(x, **kwargs):
total = x
for arg, value in kwargs.items():
print("adding %s=%s"%(arg,value))
total += value
return total
print(add(10, y=11, z=12, w=13))
可以接收任意数目的位置参数和键值对参数:
def foo(*args, **kwargs):
print(args, kwargs)
foo(2, 3, x='bar', z=10)
函数可以返回多个值,将返回的两个值变成了元组。
事实上,不仅仅返回值可以用元组表示,也可以将参数用元组以这种方式传入:
def divid(a, b):
"""
除法
:param a: number 被除数
:param b: number 除数
:return: 商和余数
"""
quotient = a // b
remainder = a % b
return quotient, remainder
z = (7,4)
print(divid(*z))
这里的*必不可少。
通过字典传入参数来执行函数:
def divid(a, b):
"""
除法
:param a: number 被除数
:param b: number 除数
:return: 商和余数
"""
quotient = a // b
remainder = a % b
return quotient, remainder
z = {'a':7,'b':4}
print(divid(**z))
这里的**必不可少。
map 方法生成序列
其用法为:
map(aFun, aSeq)
将函数 aFun 应用到序列 aSeq 上的每一个元素上,返回一个列表,不管这个序列原来是什么类型。
事实上,根据函数参数的多少,map 可以接受多组序列,将其对应的元素作为参数传入函数:
def divid(a, b):
"""
除法
:param a: number 被除数
:param b: number 除数
:return: 商和余数
"""
quotient = a // b
remainder = a % b
return quotient, remainder
a = (10, 6, 7)
b = [2, 5, 3]
print(list(map(divid,a,b)))
#list()很重要
Python 会将所有 .py 结尾的文件认定为 Python 代码文件,考虑下面的脚本 ex1.py :
%%writefile ex1.py
PI = 3.1416
def sum(lst):
"""
计算 lst 序列所有元素的和
:param lst: 序列 e.g. [1,2,3]
:return: lst 序列所有元素的总和
"""
# 获取 lst序列第一个元素
tot = lst[0]
# 循环遍历 lst 序列剩余元素
for value in lst[1:]:
tot = tot + value
return tot
w = [0, 1, 2, 3]
print(sum(w), PI)
可以执行它:
%run ex1.py
这个脚本可以当作一个模块,可以使用import关键词加载并执行它(这里要求ex1.py在当前工作目录):
import ex1
ex1
需要重新导入模块时,可以使用 reload 强制重新载入它,例如:
from imp import reload
reload(ex1)
删除之前生成的文件:
import os
os.remove('ex1.py')
name 属性
有时候我们想将一个 .py 文件既当作脚本,又能当作模块用,这个时候可以使用 name 这个属性。
只有当文件被当作脚本执行的时候, __name__的值才会是 ‘main’,所以我们可以:
%%writefile ex2.py
PI = 3.1416
def sum(lst):
""" Sum the values in a list
"""
tot = 0
for value in lst:
tot = tot + value
return tot
def add(x, y):
" Add two values."
a = x + y
return a
def test():
w = [0,1,2,3]
assert(sum(w) == 6)
print('test passed.')
if __name__ == '__main__':
test()
当作模块导入, test() 不会执行。
包
假设我们有这样的一个文件夹:
foo/
init.py
bar.py (defines func)
baz.py (defines zap)
这意味着 foo 是一个包