您的位置:首页 > 编程语言 > Python开发

Python基础教程代码与注释P103 6.5 作用域 P105 6.6 递归

2018-01-20 17:12 756 查看
# -*- 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)      #刚
4000
继续查找数字所在的上半部分
#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>")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: