一、分析变量和列表地址变化测试代码:
#通过形参不改变实参
def addOne(a):
print('形参a修改前的地址',id(a),':a=',a)
a+=1
print('形参a修改后的地址',id(a),':a=',a)
#通过形参改变实参
def modify1(v):
print("修改前形参id(v):",id(v),',v=',v)
v[0]=v[0]+1
print("修改后形参id(v):",id(v),',v=',v)
def modify2(v,item):
print('修改前形参id(v):',id(v),',v=',v)
v.append(item)
print('修改后形参id(v):',id(v),',v=',v)
b=[1,5]
if __name__== '__main__':
v=32
print('v的初始地址',id(v))
addOne(v)
print('调用addOne函数后v的地址:',id(v),',a=',v,'\n')
aa=[5]
print("实参id(a):",id(aa),',a=',aa)
modify1(aa)
print('调用midify函数后实参id(a):',id(aa),',a=',aa,'\n')
a=[2]
print("初始列表a的地址:",id(a),',a=',a)
modify2(a,3)
print('调用midify函数后实参a的地址:',id(a),',a=',a)
#变量修改值,地址改变(python中不同变量数值地址不同),传参传的是“形参”
#列表修改值,添加值,地址都不会变,且传参数传的是“实参”(或者理解成C语言的传地址)
二、测试不同变量作用类型的作用范围
def scope_test():
def do_local():
spam="我是局部变量"
def do_nonlocal():
nonlocal spam
spam="我不是局部变量也不是全局变量"
def do_global():
global spam
spam="我是全局变量"
spam="原来的值"
do_local()
print("局部变量赋值后:",spam)
do_nonlocal()
print("nonlocal变量赋值后:",spam)
do_global()
print("全局变量赋值后:",spam)
scope_test()
print("全局变量:",spam)
三、猜数字游戏
这里关于prompt是命令提示符的意思,简单用法参考注释部分,具体用法有待细究
'''系统随机产生一个数,玩家最多可以猜5次,系统会根据玩家的猜测进行提示,
玩家则可以根据系统的提示对下一次的猜测进行适当调整。'''
from random import randint
def guess():
#随机生成一个整数
value = randint(1,1000)
#最多允许猜5次
maxTimes = 5
for i in range(maxTimes):
'''
if i==0 :
print('Start to GUESS:')#prompt = 'Start to GUESS:'
else:
print('Guess again:') #prompt ='Guess again:'
'''
#使用异常处理结构,防止输入不是数字的情况
try:
#x = int(input(prompt))
x= int(input('Please Guess:'))
#猜对了
if x == value:
print('Congratulations!')
break
elif x > value:
print('Too big')
else:
print('Too little')
except:
print('Must input an integer between 1 and 999')
print('You have',maxTimes-i-1,'chance(s)')
else:
#次数用完还没猜对,游戏结束,提示正确答案
print('Game over!')
print('The value is ', value)
guess()
四、简单随机函数应用(发红包)
import random
def hongbao(total, num):
#total表示拟发红包总金额
#num表示拟发红包数量
each = []
#已发红包总金额
already = 0
for i in range(1, num):
#为当前抢红包的人随机分配金额
#至少给剩下的人每人留一分钱
t = random.randint(1, (total-already)-(num-i))
each.append(t)
already = already+t
#剩余所有钱发给最后一个人
each.append(total-already)
return each
#定义主函数,代码聪这里最先开始运行
if __name__=='__main__':
total = 50 #红包金额
num = 5 #红包个数
print('模拟10次发红包的分配情况如下:')
for i in range(10):
each = hongbao(total, num)
print(each)
*五、因式分解
from random import randint
from math import sqrt
def factoring(n):
'''对大数进行因数分解'''
if not isinstance(n, int):
print('You must give me an integer')
return
#开始分解,把所有因数都添加到result列表中
result = []
for p in primes:
while n!=1:
if n%p == 0:
n = n/p
result.append(p)
else:
break
else:
result = map(str, result)
result = '*'.join(result)
return result
#考虑参数本身就是素数的情况
if not result:
return n
testData = [randint(10, 100000) for i in range(10)]
#随机数中的最大数
maxData = max(testData)
#小于maxData的所有素数
primes = [ p for p in range(2, maxData) if 0 not in
[ p% d for d in range(2, int(sqrt(p))+1)] ]
for data in testData:
r = factoring(data)
print(data, '=', r)
#测试分解结果是否正确
print(data==eval(r))
*六、八皇后
单纯的在这里粘贴个代码,不解释。
'''八皇后问题。八皇后问题是高斯先生(就是小时候就把1+2+3+...+100转换成(1+100)*50的那个数学家)在60多年以前提出来的,
是一个经典的回溯算法问题,其核心为:在国际象棋棋盘(8行8列)上摆放8个皇后,
要求8个皇后中任意两个都不能位于同一行、同一列或同一斜线上。'''
def isValid(s, col):
'''这个函数用来检查最后一个皇后的位置是否合法'''
#当前皇后的行号
row = len(s)
#检查当前的皇后们是否有冲突
for r, c in enumerate(s):
#如果这一列已有皇后,或者某个皇后与当前皇后的水平与垂直距离相等
#就表示当前皇后位置不合法,不允许放置
if c == col or abs(row - r) == abs(col - c):
return False
return True
def queen(n, s=()):
'''这个函数返回的结果是每个皇后所在列号'''
#已是最后一个皇后,保存本次结果
if len(s) == n:
return [s]
res = []
for col in range(n):
if not isValid(s, col): continue
for r in queen(n, s + (col,)):
res.append(r)
return res
#形式转换,最终结果中包含每个皇后所在的行号和列号
result = [[(r, c) for r, c in enumerate(s)] for s in queen(8)]
#输出合法结果的数量
print(len(result))
#输出所有可能的结果,也就是所有皇后的摆放位置
#结果中每个皇后的位置是一个元组,里面两个数分别是行号和列号
for r in result:
print(r)