# -*- coding: cp936 -*-
#P103 6.5 作用域
# vars函数返回 变量和所对应的值所形成的“不可见”的字典。称为 命名空间 或者 作用域
x = 1; scope = vars()
print scope['x'], scope['x'] + 1
# 函数调用时会创建一个新的作用域
def foo():
x = 42 #局部变量 local variable
x = 1 #全局变量
foo() #调用foo()函数 x=42只在foo()函数内部作用域(局部命名空间)起作用。
print x #并未改变x的值
# 变量作为参数传入函数中
def output(x): print x
x = 1; y = 2
output(y)
# 在函数内部直接访问全局变量
def combine(parameter):
print parameter + external #引用全局变量易发生错误
external = 'berry'
combine('Shrub')
# 全局变量与局部变量同名,全局变量将被局部变量屏蔽
def combine(parameter):
print parameter + globals()['parameter'] #可以用globals()函数获取全局变量值
parameter = 'berry' #全局变量与局部变量同名
combine('Shrub')
# 重绑定 全局变量
x = 1
def change_global():
global x #告知Python这是一个全局变量
x = x + 1
change_global()
print x
raw_input("Press <enter>")
# -*- coding: cp936 -*-
#P105 6.6 递归
#6.6.1 两个经典:阶乘和幂
# 阶乘递归
def factorial(n):
result = n
for i in range(1, n):
result *= i
return result
print factorial(5)
def factorial_re(n):
if n == 1:
return 1
else:
return n * factorial_re(n-1)#递归调用
print factorial_re(5)
# 幂递归
def power(x, n):
result = 1
for i in range(n):
result *= x
return result
print power(2, 3)
def power_re(x, n):
if n == 0:
return 1
else:
return x * power_re(x, n-1) #递归调用
print power_re(2, 3)
#6.6.2 另外一个经典:二分法查找
# 查找100内的一个数
def search(sequence, number, lower = 0, upper = None): #将限制设为可选
if upper is None: #如果上限为空,即未设置上限
upper = len(sequence) - 1 #则上限的位置为 sequence的长度-1,即最后一个元素的索引
if lower == upper:#assert断言,条件为真,程序工作 #如果上下限相同,那么就是数字所在位置
assert number == sequence[upper] #条件为真时,才返回
return upper #返回上限数字
else:
middle = (lower + upper) // 2 #否则找到两者的中点,查找数字是在左侧还是在右侧
if number > sequence[middle]: #若查找的数字在sequence的右侧(即下半部分)
return search(sequence, number, middle + 1, upper) #刚继续查找数字所在的下半部分
else: #若查找的数字在sequence的左侧(即上半部分)
return search(sequence, number, lower, middle) #刚继续查找数字所在的上半部分
#seq = [34, 67, 8, 123, 4, 100, 95]
seq = range(100, 0, -2)
seq.sort()
print seq
print search(seq, 34)
print search(seq, 100)
# 函数式编程 map、filter、reduce(Python 3.0中被移至 functools 模块中
# map函数可以将序列中的元素全部传递给一个函数
print map(str, range(10))
# filter函数返回其函数为真的元素的列表,可以基于一个返回布尔值的函数对元素进行过滤
def func(x):
return x.isalnum() #isalnum字符串方法:检查字符串是否由字母或数字字符组成
seq = ["foo", "x41", "?!", "***"]
print filter(func, seq)
print [x for x in seq if x.isalnum()] #用列表推导式
filter(lambda x: x.isalnum(), seq) #用lambda 创建短小的函数
# reduce函数将序列的前2个元素与给定的函数联合使用,返回值和第3个元素继续联合使用....
numbers = [72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33]
print reduce(lambda x, y: x+y, numbers)
print sum(numbers)
raw_input("Press <enter>")