Python-全局作用域、局部作用域及递归函数

全局作用域和局部作用域以及字符串,其中穿插了递归函数的部分例子;

主要内容详见内文:

定义可变参数,参数可变,可以有个或任意多个

例1:累加
def add(*args):        
    """
定义可变参数,累加
    :param args: 可变参数
    :return: 累加求和后的值
    """
    total = 0
    for value in args:
        total += value
    return total
if __name__ == '__main__':
    print(add(1,2,3,4,5,10))

variable 变量

constant 常量

python 搜索一个变量的方式是从局部作用域到嵌套作用域再到全局作用域

Local - Enclosed - Global

如果想改变搜索范围,可以使用global 和nonlocal关键字

实际开发时,一定要减少对全局变量的使用

迪米特法则

在函数外面定义的a是一个全局变量

global variable

a = 100
def f():
    # 函数内的局部变量,离开f()函数变量a是无法访问的
    # local variable
    global a   # 局部变量中执行全局变量
    a = 200
    print(a)
f()
print(a)
小结:从局部作用域到嵌套作用域再到全局作用域,弄清楚每一步步骤~
例2:21根火柴,人先拿,机后拿,(1,4),最后拿到一根火柴的输
from random import  randint


def main():
    total = 21
    while total > 0:
        while True:
            num = int(input('拿几根火柴:'))
            if 1 <= num <= 4 and num <= total:
                break
        total -= num
        if total > 0:
            com = randint(1,min(4,total))
            print('计算机拿走了%d根火柴'%(com))
            total -= com
            if total == 0 :
                print('电脑拿到了最后一根火柴,你赢了!')
        else:
            print('你拿到了最后一根火柴,你输了!')

if __name__ == '__main__':
    main()
小结:其实可以做到,因为是人先拿,如果电脑每次都拿5-num次,那么人铁定会输~这里没有写,就当都是随机取吧,更具有娱乐感~
例3:求阶乘n! =n*(n - 1)!
def f(n):
    if n == 0 or n==1:
        return 1
    return n*f(n-1)
if __name__ == '__main__':
    # 在进入函数调用之前要保存当前的执行现场
    # 函数的执行现场是保存在一种称为栈(stack)的内存空间上
    # 栈是一种先进后出(FILO)的存储机构
    print(f(100))
小结:这里用到递归函数,简化了写代码的过程,几句话就搞定阶乘的计算。

函数的递归调用:

1.收敛条件 - 让递归在有限的次数内完成或者回溯

2.如果递归无法在有限次数内收敛有可能导致RecursionError

3.递归公式

例4:累加
def f(n):
    if n == 1:
        return 1
    return n+f(n-1)
if __name__ == '__main__':
    print(f(100))
例5:10级楼梯,每次只能跨1-3级,共有多少种方法?
def walk(n):
    if n < 0:
        return 0
    elif n == 0:
        return 1
    return walk(n-1) + walk(n - 2) + walk(n - 3)
if __name__ == '__main__':
    print(walk(10))
小结:这两个是递归函数的进一步运用,找到规律,宏观观察,确定收敛条件,写出递归公式,就可以写出递归函数。

字符串:

def main():
    # 不变字符串
    str1 = 'hello,world!'
    print(len(str1))           # 长度
    print(str1.capitalize())   # 首字母大写
    help(str1.capitalize)
    print(str1.upper())           #全转大写
    print(str1.lower())           #全转小写
    print(str1.find('or'))       #寻找字符串
    print(str1.find('shit'))  #寻找字符串
#   print(str1.index('or'))
#   print(str1.index('shit'))
    print(str1.startswith('he'))
    print(str1.endswith('!'))
    print(str1.center(50,'*'))
    print(str1.rjust(50,'#'))
    print(str1.ljust(50,'$'))
    str2 = 'abc123456'
    print(str2[2])           # 下标运算
    print(str2[2:5])         # 切片
    print(str2[-1:-3:-1])    # '-'方向
    print(str2[-3:-1])
    print(str2[2:])
    print(str2[2::2])
    print(str2[:])
    print(str2[::2])
    print(str2[::-1])
    print(str2.isdecimal())  # 判断字符串中是否全是数字
    print(str2.isalpha())    # 判断字符串中是否全是字母
    print(str2.isalnum())    # 判断字符串中是否全为字母或数字
    str3 = '  jackfrued@126.com '
    print(str3.strip())      #去掉左右两边的空格

if __name__ == '__main__':
    main()
例6:字符串跑马灯
import os
import time


def main():
    str4 = '欢迎来到千峰大世界~~~~~~~~'
    while True:
        os.system('cls')
        print(str4)
        time.sleep(0.5)
        str4 = str4[1:]+ str4[0]


if __name__ == '__main__':
    main()
小结:运用字符串以及命令窗口清除的函数,实现跑马灯的效果~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值