Python——环境变量、递归和字符串

"""
Author:王星喆
Data: 2018-3-6

"""

注意 定义函数时如果设默认值等号两边不要加空格

def roll_dice(n=2):
    pass
a = 100
roll_dice(n=5)#调用时也不要加空格

局部变量和全局变量

#variable 变量
#constant 常量

"""
a = 100
def foo():
    print(a)
    a = 200
foo()
报错,
"""
#在函数外面定义一个a是一个全局变量
#global variable
a = 100


def foo():
    #local variable
    #函数内的局部变量,离开foo函数变量a是无法访问的
    global a #在函数里面定义修改全局变量
    a = 200 #如果没有定义局部变量a,函数会访问外面的全局变量
    print(a)
    
    
foo()
print(a)    
200
200
#python 访问变量的顺序,从局部作用域到非局部作用域(嵌套作用域)再到全局作用域,最后去内置作用域
#Local - Enclosed - Global - Bulit
#LEGB
#如果想改变搜索范围可以使用global和nonlocal关键字
a = 100
b = 'good' #全局作用域
def foo():
    b = 'hello'#非局部作用域
    def bar():
        nonlocal b # 搜索到非局部作用下的b
        b = 'good'
        print(a)
        print(b)#局部作用域
    
    bar()
    print(b)
    
    
foo()
print(b)
100
good
good
good

注意 实际开发是一定要减少对全局变量的使用

  • 迪米特原则 尽量不要让代码之间有过多的连接,保持模块之间相对的独立
#内置作用域
#built 内置
print(print)
<built-in function print>

函数自己调自己

#foo - fuck up
#bar - beyond all recongniitin
def foo():
    foo()

递归

  • 写了一个函数,直接或间接的调用了自己,就叫递归
#在进入函数调用之前要保存当前的执行现场
#函数的执行现场是保存在一种称为栈(stack)的内存空间上
#栈是一种先进后出(FILO)的存储结构(栈很小,但是很快)
# n! = n * (n - 1)!
def f(n):
    if n == 0 or n == 1:
        return 1
    return n * f(n - 1)
#f(5) = 5 * f(4)
#f(4) = 4 * f(3)
#f(3) = 3 * f(2)
#f(2) = 2 * f(1)
#f(1) = 1
print(f(5)) #次数有限制,不能超过998,也略有差别
#这种方式性能是比较低下
120
# 求两个数的最大公约数,短除法
def gcd(x, y):
    if x > y:
        return gcd(y, x)
    elif y % x == 0:
        return x
    else:
        return gcd(y % x ,x)
print(gcd(27,15))
3
#1到100求和 递归
#10级楼梯,上楼梯,一次走1至3,走完台阶有多少种走法 
#汉诺塔


#函数的递归调用
#1.收敛条件 - 让递归在有限的的次数完成或者进行回溯
#如果递归无法在有限次数内收敛就有可能导致RecursionError
#2.递归公式
def my_sum(x):
    """
    求阶乘
    :param x: 一个非负整数
    :return: x的阶乘
    """
    if x == 0 or x == 1:
        return 1
    return x + my_sum(x - 1)
print(my_sum(100))
5050
def walk(n):
    """

    :param n:台阶 数
    :return: 有多少种走法
    """
    if n < 0:
        return 0
    elif n == 0:
        return 1
    return walk(n - 1) + walk(n - 2) + walk(n - 3)
print(walk(10))
274

bit 0或1

  • 8 bit =1 Byte
  • 1024 Byte = 1KB
  • 1024 KB = 1MB
  • 1024 MB = 1GB
  • 1024 GB = 1TB
  • 1024 TB = 1PB
def hanoi(n, a, b, c):
    if n > 0:
        hanoi(n - 1, a, c, b)
        print(a, '-->', b)
        hanoi(n - 1, c, b, a )
        
hanoi(3, 'a', 'b', 'c')
a --> b
a --> c
b --> c
a --> b
c --> a
c --> b
a --> b

字符串

#不变字符串
str1 = 'hello,world!'
print(len(str1))
#计算字符串长度
print(str1.capitalize())
#字符串首字母大写
print(str1.upper())
#字符串全大写
print(str1.find('or'))
#返回某个字符在在字符串的位置,找不到返回-1
print(str1.index('or'))
#返回某个字符在在字符串的位置,找不到报错
print(str1.startswith('He'))
#判断是否以给定的字符开头,返回布尔型数据
print(str1.endswith('!'))
#判断是否以给定的字符结尾,返回布尔型数据
print(str1.center(50, '*'))
#居中,并用
print(str1.rjust(50, ' '))
#右对齐
11
Hello,world
HELLO,WORLD
7
7
False
str2 = 'abc12356'
print(str2.isdigit())
#判断字符串是否全是数字,返回布尔类型
print(str2.isalpha())
#判断字符串是否全是字母,返回布尔类型
print(str2.isalnum())
#判断字符串是否全是数字和字母,返回布尔类型
print(str2[2])
#返回对应索引的字符
print(str2[2: 5])
#字符串切片,开始索引从0开始数,结束索引从1开始数
print(str2[-1])
#会倒着取
print(str2[-1:-3:-1])
#倒着切片
print(str2[2:])
#从2取到结尾
print(str2[2::2])
#从2取到结尾,步长是2
print(str2[::-1])
#字符串的倒转

False
False
True
c
c12
6
65
str3 = ' qustwxz@163.com '
print(str3.strip())
#去掉字符串左右两边的空格
help(str3.capitalize)
qustwxz@163.com
Help on built-in function capitalize:

capitalize(...) method of builtins.str instance
    S.capitalize() -> str
    
    Return a capitalized version of S, i.e. make the first character
    have upper case and the rest lower case.
"""
一个长字符串,做成跑马灯效果
#cls 清屏
# operating system
import os
os.system('cls')
time.sleep(0.5)
"""
"""

1.函数
给定验证码长度默认4,生成验证码(由数字大小写字母)
2.函数
输入文件名,提取出后缀名
3.生成一个文件名的函数(由数字大小写字母)
4.用列表,2个骰子点数之和出现的次数
"""
from random import randint
def verification_code(n=4):
    """
    返回一个验证码
    :param n: 验证码的位数
    :return: 返回一个验证码
    """
    str1 = ''
    for _ in range(n):
        r = randint(1,3)
        if r == 1:
            choice = randint(48,57)
        elif r == 2:
            choice = randint(97,122)
        else:
            choice = randint(65,90)

        str1 = str1 + chr(choice)
    return str1
print(verification_code(6))
9chQ3n
def my_file(str='.'):
    """
    返回文件名后缀
    :param str: 文件名
    :return: 返回并打印文件名
    """
    str.strip()
    return print(str[str.rfind('.') + 1:])
my_file('test.py')
py
from random import randint

def main():
    list1=[0,0,0,0,0,0,0,0,0,0,0]
    for _ in range(60000):
        list1[randint(1, 6) + randint(1, 6) - 2] += 1
    print(list1)
main()
[1694, 3407, 4895, 6689, 8296, 9991, 8353, 6620, 4984, 3388, 1683]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值