【Python】一些入门的Python练习代码(变量地址、变量作用范围、随机数应用、因式分解、八皇后)

一、分析变量和列表地址变化测试代码:

#通过形参不改变实参
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)

发布了86 篇原创文章 · 获赞 83 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41856733/article/details/102911408
今日推荐