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

# -*- 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>")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值