判断函数是否可以被调用
该函数在python3上并不被支持!!!!!
import math
x = 1
y = math.sqrt #关联到函数
callable(x)
callable(y)
创建函数、返回值
def hello(name):
return 'Hello, ' + name + '!'
print hello("Zk")
在函数、模块、类开头写下相关文档,即直接写一个字符串~
这个字符串会被储存起来,可以供给查看
def square(x):
'Calculates the square of the number x' #看!这就是文档字符串啦
return x*x
print square(2)
#可以通过__doc__属性查看
square.__doc__
#也可以通过内建函数help查看
help(square)
def test():
print 'Hello!'
x = test()
print x
跟C语言一样,每个实参和形参的位置必须一一对应
通过“形参=实参”的形式传递值
def hello(name, greeting):
print '%s, %s!' % (greeting, name)
hello(greeting='Hello', name='world')
#参数还可以提供默认值
def hello(name = 'world', greeting = 'Hello'):
print '%s, %s!' % (greeting, name)
hello()
hello(greeting = 'Hey')
位置参数和关键词参数可以混用,但是位置参数必须写在关键词参数前面
关键词参数一般也要有默认值
可以收集任意多个参数
*表示收集任意多个位置参数(作为元组)
**表示收集任意多个关键词参数(作为字典)
def print_params(x, y, z = 3, *pospar, **keypar): #位置参数、关键词参数、两种收集参数混用
print 'x, y, z = ', x, y, z
print 'pospar = ', pospar
print 'keypar = ', keypar
print_params(1, 2, 3, 5, 6, 7, foo = 1, bar = 2)
#先收集位置参数、位置参数
#*收集其余位置参数
#**收集其余关键词参数
用元组为函数的位置参数提供实参
用字典为函数的关键词参数提供实参
def add(x, y):
return x + y
params = 1, 2
add(*params) #加上星号表示把元组元素取出来依次作为位置参数的实参
def hello(name, greeting):
print '%s, %s!' % (greeting, name)
params = {'name' : 'world', 'greeting' : 'Hello'}
hello(**params) #加上两个星号表示把字典的“键-值”取出来分别作为“关键词-值”来作关键词参数的实参
def power(x, y, *others):
if others: #判断others是否存在
print 'Received redundant parameters:', others
return pow(x, y)
power(3, 3, 'Hello world!')
def hello(name, greeting = None):
if greeting == None: #把默认值设为空,是否接收这个参数,判断其值是否为空即可
print "lack for the parameter: 'greeting'"
else:
print "%s, %s!" % (greeting, name)
hello('world', 'Hello')
hello('world')
x = 1
scope = vars()
scope
scope['x']
#一般来说,vars返回的字典不能修改,其结果是未定义的
除了全局变量有作用域外,每个函数调用都会创建一个新的作用域
#函数内取用全局变量,借助globals函数即可
globals()['x']
#在函数内部声明全局变量
def hhhh():
global x #用global声明变量
x = 2
hhhh()
x
python的函数是可以嵌套定义的
函数的嵌套定义是很少用的,一般用来“用一个函数创建另一个函数”
这里把子函数存储子封闭作用域,该行为称为闭包(closure)
def multiplier(factor):
def multiplyByFactor(number): #嵌套的子函数
return number * factor
return multiplyByFactor #这里美柚给出实参number,意味着返回的是一个函数名
double = multiplier(2)
#这里创建了一个函数double相当于
#def double(number)
# return number * 2
#multiplier函数接受了实参factor=2,代入给multiplyByFactor函数,得到一个double函数
double(5) #return 5 * 2
#其实这也相当于
multiplier(2)(5)
递归的效率并不高,但是易懂
#阶乘
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n - 1)
factorial(3)
#幂运算
def power(x, n):
if n == 0:
return 1
else:
return n * power(x, n - 1)
#二分法查找
def search(sequence, number, lower, upper):
'squence为一个序列,number为目标数字,lower和upper分别表示下限、上限索引号'
sequence.sort() #二分法查找需要序列排序
if lower == uppeer:
assert number == sequence[upper] #断言该数字存在于序列之中
return upper
else:
middle = (lower + upper) // 2
if number > sequence[middle]:
return search(sequence, number, middle + 1, upper)
else:
return search(sequence, number, lower, middle)
map, filter函数可以通过列表推导式取代
reduce函数不常用
#lambda表达式,可以创建短小的函数(lambda在数学中表示匿名函数)
#reduce函数,可以将一个序列的前两个数字作为参数传递给指定函数,将返回值和第三个数字再作为参数,以此类推
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
reduce( lambda x, y: x +y , numbers )
#lambda x, y: x + y表示创建一个函数,接受两个参数x和y,返回他们的和
#numbers为若干要作为参数的的一个序列
#reduce第一个参数为函数,第二个函数为序列,返回处理完整个序列后的结果