关于之前的变量命名:
驼峰命名法:首个单词小写,后面单词首字母大写
isPrime,isPalindrome,ageOfStudent
PEP 8(官方增强提案):
is_prime,is_palindrome,age_of_student
作用域
-
全局作用域(global):函数外定义的a叫全局变量
a = 100
def foo()
pass
-
局部作用域(local):函数内的局部变量,离开函数 变量a是无法访问的
def foo()
a = 200
-
非局部作用域(nonlocal):嵌套函数外的局部变量,离开嵌套函数 变量a是无法访问的
def foo():
a = 200
def bar():
b='hello'
-
内置作用域(built-in function print):系统定义的
def foo():
print(print)
实际开发时要减少全局变量的使用,尽量使用局部变量
迪米特法则:不要跟陌生人讲话
# 代码关联要少,要简洁
python 搜索一个变量的方式从局部作用域到嵌套作用域再到全局作用域最后到内置作用域
Local - Enclosed - Global - built-in LEGB
如果想改变搜索范围,可以使用global和nonlocal关键字
函数名如果不知道取什么名或者做测试,可以使用foo 和 bar
foo - fuck up
bar - beyaond all recognization (超出了所有的认知,,,即不知道是什么狗屎哈哈哈哈哈)
递归函数(函数自己调用自己)
收敛条件 - 让递归在有限的次数完成或者进行回溯
如果递归无法在有限次数内收敛就有可能导致RecursionError
阶乘就是递归的定义
def foo(n):
"""
递归求阶乘
:param n: 一个正整数
:return: 这个数的阶乘
"""
if n == 0 or n == 1:
return 1
return n * foo(n-1)
使用递归和辗转相除法/欧几里得算法/短除法求最大公约数
def gcd(x,y):
if x>y:
return gcd(y,x)
elif y%x==0:
return x
else:
return gcd(y%x,x)
在进入函数之前要保存当前的执行现场
函数的执行现场是保存在一种称为栈(stack)的内存空间上
栈是一种先进后出(FILO)的存储结构
两个递归题目:
1.10级台阶,一次走1到3次,一共有多少种走法
2.汉诺塔
其实有点懵。。。
def f1(n):
#10级台阶,一次走1到3次,一共有多少种走法
if n < 0:
return 0
elif n == 0:
return 1
return f1(n-1) + f1(n-2) + f1(n-3)
def hanoi(n,a,b,c):
#汉诺塔
if n > 0:
hanoi(n-1,a,c,b)
print(a,'------>',b)
hanoi(n-1,c,b,a)
字符串(不变的)
def main():
#不变字符串
str1 = 'hello, world!'
print(len(str1))
print(str1.capitalize())
print(str1.upper())
print(str1.find('or'))
print(str1.index('or'))
print(str1.startswith('he'))
print(str1.endswith('!'))
print(str1.center(50,'*'))
print(str1.rjust(50,'-'))
print(str1.ljust(100,' '))
str2 = 'abc123456'
print(str2.isalpha())
print(str2.isdigit())
# 数字或者字母
print(str2.isalnum())
str3 = ' songjiaxin@qq.com '
print(str3.strip())
print(str2[2])
print(str2[1:4])
print(str2[-1:-3:-1])
print(str2[-3:-1])
print(str2[2:])
print(str2[2::2])
print(str2[::2])
print(str2[::-1])
走马灯(只有在命令行提示符里运行)
def horse_race():
import os
import time
sss = '欢迎来到成都千峰。。。'
while True:
os.system('cls')
print(sss)
sss = sss[1:] + sss[0]
time.sleep(0.5)
作业:
from random import *
import uuid
import socket
from datetime import *
# 随机验证码
# 65-90 97-122
def identifying_code(n=4):
"""
获取随机验证码
:param n: 验证码长度
:return: 验证码
"""
print('随机验证码为:',end=' ')
# for i in range(n):
# print(choice((randint(1,10),chr(randint(65,90)),chr(randint(97,122)))),end=' ')
if n>0:
code_all = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
char_len = len(code_all)-1
code = ''
for _ in range(n):
index = randint(0,char_len)
code += code_all[index]
return code)
# 取出文件的后缀名
def random_Suffix(filename,has_pot=False):
"""
获取文件的后缀名
:param filename:文件名
:param has_pot: 后缀名是否带点
:return: 文件的后缀名
"""
pos = filename.rfind('.')
if 0 < pos < len(filename) - 1:
index = pos if has_pot else pos+1
return filename[index:]
else:
return ''
# 生成随机文件名,保证不重名
def random_file():
nowTime = datetime.now().strftime("%Y%m%d%H%M%S")
randomNum = randint(0,100)
mac = uuid.UUID(int=uuid.getnode()).hex[-12:]
myName = socket.getfqdn(socket.gethostname())#本机名
myIp = socket.gethostbyname(myName)#本机ip
print('随机文件名:',str(nowTime)+str(randomNum)+myIp+mac+'.exe')
# 统计两颗骰子各点数出现的次数
def f(n):
list1 = [0]*(6*n-n+1)
for i in range(60000):
total=0
for j in range(n):
total += randint(1,6)
list1[(total-n)] += 1
for i,val in enumerate(list1):
print('%d点摇出的概率是%.2f%%'%(i+n,val/600))
if __name__ == '__main__':
identifying_code(5)
random_Suffix()
random_file()
f(3)
常识:
现实生活1kg mg 是 10**3
计算机 K 是2**10 = 1024
这就是买的U盘永远没有那么大的原因
100Mbps
8bit = 1Byte
这就是100兆宽带最高只有12.5兆的原因
1024Byte = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
网友评论