python之 简单入门题2:条件分支和循环流程、列表和字符串、模拟系统

  • Post author:
  • Post category:python


简单入门题,涉及到的知识:条件分支和循环流程、列表和字符串、模拟系统

条件分支流程(if语句)、循环流程

1.将一个数组中的值按逆序重新存放。

例如,原来的顺序为 8,6,5,4,1。要求改为 1,4,5,6,8。

n = int(input('数组中元素的个数 n:'))
l = []
l1 = []
for i in range(1,n+1):
    s = int(input(''))
    l.append(s)
print(l)
for i in range(1,n+1):
    s = l.pop()
    l1.append(s)
print(l1)

2.DoinB:

十五个猴子围成一圈选大王,依次1-7 循环报数,报到7 的猴子被淘汰,直到最后一只猴子成为大王。问,哪只 猴子最后能成为大王

monkeys = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
num = 0
while True:
    for i in range(1,7):
        monkeys.append(monkeys[0]) #第一次循环第一个元素为1,将第一个添加到列表后面,同理,第二次循环就是将2添加到列表的最后面
        del(monkeys[0])  #第一次循环删除列表的第一个元素,也就是1,然后2就变成了列表的第一个元素。同理,第二次循环就删除的2
        if i == 6:
            num += 1
            print('第%d次出局猴子的编号为:%d' % (num, monkeys[0]))
            monkeys.pop(0) #循环6次之后,第7次将第7个元素出栈,删除第七个元素,继续循环下去
    if len(monkeys)==1: #要选出来的大王
        break
print()
print('猴子大王的编号为:%d' % int(monkeys[0]))

3.螺旋填数:

读入两个整数m,n,输出一个m 行n 列的矩阵,这个矩阵是1~m * n,这些自然 数按照右、下、左、上螺旋填入的结果。

n = int(input(''))
arr = [[0]*n for i in range(n)]#初始化数组
def dfs(arr, x, y, start, n):#递归解决
    if n<=0:return 0
    if n==1:
        arr[x][y] = start
        return 0
    #up
    for i in range(n):
        arr[x][y+i] = start
        start += 1
    #right
    for i in range(n-1):
        arr[x+1+i][y+n-1] = start
        start += 1
    #down
    for i in range(n-1):
        arr[x+n-1][y+n-2-i] = start
        start += 1
    #left
    for i in range(n-2):
        arr[x+n-2-i][y] = start
        start += 1
    dfs(arr,x+1,y+1,start,n-2)

a = dfs(arr,0,0,1,n)
#格式化输出print
l = len(str(n*n))+1
format = ('%'+str(l)+'d')*n
for tmp in arr:
    print (format%tuple(tmp))

4.八皇后问题

def conflict(state, nextColumn):
    nextRow = rows = len(state)
    for row in range(rows):
        column = state[row]
        if abs(column - nextColumn) in (0, nextRow - row):
        #如果差值等于0,两个皇后在同一列,列的差值等与行的差, 两个皇后在对角线上, 则代表冲突返回True;
            return True
    return False
def queens(num, state=()):#num: 皇后的数量 。state: 标记已经排好的每个皇后的位置
    for pos in range(num):  # 八皇后的数量N=0, 1, 2, 3, 4, 5, 6 , 7 你要在哪一列放置皇后
        if not conflict(state, pos):  # 如果不冲突,则递归构造棋盘。
            # 如果棋盘状态state已经等于num-1,即到达倒数第二行,而这时最后一行皇后又没冲突,直接yield,打出其位置(pos, )
            if len(state) == num - 1:
                yield (pos,)
            else:  # (0, )
                for result in queens(num, state + (pos,)):
                    yield (pos,) + result

def prettyprint(solution):#用X表示每个皇后的位置
    def line(pos, length=len(solution)):
        return ' . ' * (pos) + ' x ' + ' . ' * (length - pos - 1)
    for pos in solution:
        print(line(pos))

if __name__ == '__main__':
    solutions = queens(8)
    for index, solution in enumerate(solutions):
        print("第%d种解决方案:" % (index + 1), solution)
        prettyprint(solution)
        print('*' * 100)

5.扔两个骰子游戏

游戏规则:游戏者随机扔两个骰子,每个骰子有六个面,分别标有1、2、3、4、5、6。把两个骰子朝上的点 数相加。

如果相加的和为7或者11,那么赢,如果和为2、3或12,输。

如果和为4、5、6、8、9、10,那么此和为游戏者的点数,如果想赢,可以接续扔骰子,直到新扔出的点数相加和第一次点数相同算输。如果继续扔 出的点数相加为7,则为输。 要

求:用户输入1则为继续扔骰子,输入0则结束,每次扔完骰子,都要询问用户,是否要继续。

每一行都必须写注释,注释的量要占到整个程序的80%

'''
游戏规则:游戏者随机扔两个骰子,每个骰子有六个面,分别标有1、2、3、4、5、6。把两个骰子朝上的点 数相加。
如果相加的和为7或者11,那么赢,如果和为2、3或12,输。
如果和为4、5、6、8、9、10,那么此和为游戏者的点数,如果想赢,可以接续扔骰子,直到新扔出的点数相加和第一次点数相同算输。如果继续扔 出的点数相加为7,则为输。 要
求:用户输入1则为继续扔骰子,输入0则结束,每次扔完骰子,都要询问用户,是否要继续。
每一行都必须写注释,注释的量要占到整个程序的80%
'''
import random

winList = [7, 11]
lostList = [2, 3, 12]
continueList = [4, 5, 6, 8, 9, 10]
score = []
def throw():
    return random.randint(1, 6)

#第一次扔骰子
ss1 = throw()
ss2 = throw()
print("骰子扔出的点数分别为:",ss1,"\t",ss2,"\t和为:",ss1+ss2)#第一次扔骰子所扔出的点数
if ss1+ss2 in winList:#如果点数和为7或者11,那么赢。
    print("赢!")
elif ss1+ss2 in lostList:#如果点数和为2、3或12,输。
    print("输!")
else:
    one = ss1+ss2
    print("目前游戏者的点数为:",one)#如果和为4、5、6、8、9、10,那么此和为游戏者的点数
    print("是否要继续? 1(继续) / 0(退出):")#如果想赢,游戏者可以选择接续扔骰子
    n = int(input('')) #询问用户,是否要继续
    if n == 1:#用户输入1则为继续扔骰子
        s1 = throw()
        s2 = throw()
        print("骰子扔出的点数分别为:", s1, "\t", s2,"\t和为:",s1+s2)#如果想赢,游戏者可以选择接续扔骰子
        if s1+s2 == one and s1+s2 == 7:
            print("输!")
        while s1+s2 != one and s1+s2 != 7:#如果继续扔出的点数相加为7,或者新扔出的点数相加和第一次点数相同,则为输。
            one = s1 + s2#更新游戏者的点数
            print("目前游戏者的点数为:", one)
            print("是否要继续? 1(继续) / 0(退出):")
            n = int(input(''))#询问用户,是否要继续
            if n == 0:#用户输入0则结束游戏
                print("已退出!")
                break
            elif n != 1 and n != 0:#如果用户输入的既不是1也不是0,那么则输入错误
                print("输入错误!")
            #用户输入1则为继续扔骰子所扔出的点数
            s1 = throw()
            s2 = throw()
            print("骰子扔出的点数分别为:", s1, "\t", s2,"\t和为:",s1+s2)#如果想赢,游戏者可以选择接续扔骰子
    elif n == 0:#用户输入0则结束游戏
        print("已退出!")
    else:#如果用户输入的既不是1也不是0,那么则输入错误
        print("输入错误!")

列表、字符串

1.字符串

dict1 = {}
print(dict1.fromkeys((1, 2, 3), ('one','two', 'three')))#{1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}
print(dict1.fromkeys((1, 3), '数字')) #{1: '数字', 3: '数字'}


dict1={'one':1,'two':2,'three':3}
dict2 = dict1.copy()
print(dict2)

(2)

a = dict(one=1, two=2, three=3)
b = {'one': 1, 'two': 2, 'three': 3}
c = dict(zip(['one', 'two', 'three'],[1, 2, 3]))
d = dict([('two', 2), ('one', 1),('three', 3)])
e = dict({'three': 3, 'one': 1,'two': 2})

结果为:

#结果
{'one': 1, 'two': 2, 'three': 3}
{'one': 1, 'two': 2, 'three': 3}
{'one': 1, 'two': 2, 'three': 3}
{'two': 2, 'one': 1, 'three': 3}
{'three': 3, 'one': 1, 'two': 2}

2.给定一个字符,用它构造一个底边长 5 个字符,高 3 个字符的等腰字符三角形。

for i in range(1,4):
    print((3-i)*" ",(2*i-1)*"*")

3.输入一个字符串,输出该字符串是否回文。回文是指顺读和倒读都一样的字符串。

s = input("")
print(s)
left = 0
right = len(s) - 1
if len(s) <= 100:
    while left <= right:
        if s[left] == s[right]:
            left += 1
            right -= 1
        else:
            break
    if left > right:
        print('{}是回文字符串!'.format(s))
    else:
        print('{}不是回文字符串!'.format(s))

4.给定硝酸、王水、粗汞、铅、矾的量,问可以炼出多少需要的物质

s = input("请输入硝酸、王水、粗汞、铅、矾的量(用空格隔开):")
ss = s.split()
print(ss)
list = []
for i in range(0,5):
    list.append(int(ss[i]))
print(min(list[0],list[1],list[2]//2,list[3]//7,list[4]//4))

5.输入一个长度不超过80 的字符串,输出其最小周期。

s = input("")
count = 0
for i in range(1, len(s)):
    if len(s) % i == 0:
        flag = True
        for j in range(i, len(s)):
            if s[j % i] != s[j]:
                flag = False
                break
        if flag:
            count = i
            print(count)
            break

if count == 0:
    print('不是一个周期串!')

模拟用户注册和登录

1.模拟用户注册和登录功能,还有菜单功能:

user_data = {}
#用户注册:
def logon():
    prompt = '请输入用户名:'
    while True:
        name = input(prompt)
        if name in user_data:
            prompt = '此用户名已经被使用,请重新输入:'
            continue
        else:
            break
    password = input('请输入密码:')
    user_data[name] = password
    print('注册成功,赶紧试试登录吧^_^')

#用户登录
def login():
    prompt = '请输入用户名:'
    while True:
        name = input(prompt)
        if name not in user_data:
            prompt = '您输入的用户名不存在,请重新输入:'
            continue
        else:
            break
    password = input('请输入密码:')
    check_password = user_data.get(name)
    if password == check_password:
        print('欢迎进入XXOO系统,请点右上角的X结束程序!')
    else:
        print('密码错误!')

#菜单
def showmenu():
    print( """
|--- 新建用户:N/n ---|
|--- 登录账号:E/e ---|
|--- 推出程序:Q/q ---|
|--- 请输入指令代码:""")
    while True:
        chosen = False
        while not chosen:
            choice = input()
            if choice not in 'NnEeQq':
                print('输入的指令代码错误,请重新输入:')
            else:
                chosen = True

        if choice == 'q' or choice == 'Q':
            break
        if choice == 'n' or choice == 'N':
            logon()
        if choice == 'e' or choice == 'E':
            login()

showmenu()

2.添加查找功能:

user_data = {"张三": "19834422222"}

def find():
    name = input('请输入联系人姓名:')
    if name in user_data:
        print("%s : %s " % (name, user_data[name]))
    else:
        print('您输入的姓名不在通讯录中!')
        showmenu()

def keep():
    name = input('请输入联系人姓名:')
    if name in user_data:
        print("您输入的姓名已在通讯录中存在 --> %s:%s")
        print("%s : %s " % (name, user_data[name]))
        flag = input("是否修改用户资料(YES/NO):")
        if flag == 'YES':
            tel = input('请输入用户联系电话:')
            user_data.update({name: tel})  # 更新字典
            print("联系人已更新!")
        else:
            showmenu()
    else:
        user_data[name] = input('请输入联系人电话:')
        print("联系人已保存!")

def delete():
    name = input('请输入要删除的联系人姓名:')
    if name in user_data:
        flag = input('确定要删除此联系人?(YES/NO)')
        if flag in ['YES', "yes", "Y", "y"]:
            del (user_data[name])
            print('联系人 %s 删除成功!' % name)
        else:
            showmenu()
    else:
        print('%s 不在通讯录中!' % name)

def showmenu():
    print(""" 
    |--- 欢迎进入通讯录程序 ---| 
    |---  1:查询联系人资料 ---| 
    |---  2:插入新的联系人 ---| 
    |---  3:删除已有联系人 ---| 
    |---  4:退出通讯录程序 ---|""")

    while True:
        button = int(input("请输入相关指令:"))
        if button == 1:
            find()
        if button == 2:
            keep()
        if button == 3:
            delete()
        if button == 4:
            print("|--- 感谢使用通讯录程序 ---|")
            break

showmenu()



版权声明:本文为qq_45956730原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。