"""
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]