学习python,从入门到放弃(6)


学习python,从入门到放弃(6)

昨日作业

昨日留下了一个猜年龄的代码作业用于巩固前面所学知识,今日给定了标准答案。

# TODO:写任何业务 都应该先搭建主体功能 之后再考虑配套优化
# 1.定义真是的年龄
real_age = 18
# 7.定义一个记录用户猜测次数的计数器
guess_count = 1
# 5.将需要反复执行的代码缩进到while子代码中
while True:
    # 9.判断当前用户到底猜测了几次
    if guess_count == 4:
        # 10.提示用户已经尝试了三次 是否继续尝试
        is_again = input('您已经尝试了三次 是否继续(y/n)>>>:')
        # 11.判断用户是否继续
        if is_again == 'y':
            # 12.重置用户尝试的次数
            guess_count = 1
        else:
            # 13.直接结束循环
            print('下次记得来玩哟!!!')
            break
    # 2.获取用户猜测的年龄
    guess_age = input('请输入猜测的年龄>>>:')
    # 3.将字符串类型的数字转换成整型类型的数字
    guess_age = int(guess_age)  # 该代码可能会报错 暂且忽略
    # 4.比较猜测的年龄和真实年龄
    if guess_age > real_age:
        print('哎呀 讨厌 猜大了')
        guess_count += 1  # 8.猜错了就应该自增依次
    elif guess_age < real_age:
        print('不好意思 没那么小')
        guess_count += 1  # 8.猜错了就应该自增依次
    else:
        print('哈哈哈 你真棒!!!')
        # 6.一旦猜对了 立刻结束循环
        break

我也给出了我的答案。

import random
chances = 1
age = random.randint(1, 100)  # 生成随机数
is_again = False
while chances <= 3:
    age_guess = int(input('请输入猜测的年龄:'))
    if age == age_guess:
        print('猜对了,牛逼666!')
        break
    elif age > age_guess:
        print('小了,您还有%d次机会' % (3 - chances))
        if chances == 3:
            print("游戏结束,菜鸡")
            while True:
                again = input('是否再来三次 y/n')
                if again == 'y' or again == 'Y':
                    is_again = True
                    break
                elif again == 'n' or again == 'N':
                    break
                else:
                    print("请输入y/n")
                    continue
    elif age < age_guess:
        print('大了,您还有%d次机会' % (3 - chances))
        if chances == 3:
            print("游戏结束,菜鸡")
            while True:
                again = input('是否再来三次 y/n')
                if again == 'y' or again == 'Y':
                    is_again = True
                    break
                elif again == 'n' or again == 'N':
                    break
                else:
                    print("请输入y/n")
                    continue
    chances += 1
    if is_again:
        chances = 1
        is_again = False

对比来看老师的代码简洁明了,用稍少的代码完成了目标,我的代码虽然有些冗长而且有重复的代码块,但是添加了年龄随机数还有在输入 y/n 的时候考虑了输入别的内容的情况。

循环结构补充

  • while + else

    while 是常用的循环体代码,而 else 的作用则在于当 while 没有被关键字 break 提前结束的情况下,正常结束循环体代码后才会执行。

    可以看到循环在 count = 4 的时候 break 了,所以 else 语句中的字符并没有输出出来。

    这里可以看见,条件直接从 5 开始,没有在 4 时跳出循环,while 循环正常结束了,于是 else 中的字符就正常的打印出来了。

  • 死循环

    死循环即永远无法结束的循环,会一直占用CPU的资源工作,会极度影响电脑的性能,甚至会造成硬件的损坏。

  • while 嵌套

    在一个循环中再套入一个或多个循环,就是循环的嵌套。

    flag = True
        while flag:
            username = input('username>>>:')
            password = input('password>>>:')
            if username == 'jason' and password == '123':
                print('登录成功')
                while flag:
                    cmd = input('请输入您的指令>>>:')
                    if cmd == 'q':
                        print('下次光临')
                        flag = False
                    print('正在执行您的指令:%s' % cmd)
            else:
                print("用户名或密码错误")
    
  • for 循环

    for 循环可以做到的事,虽然 while 循环也可以做到,用法也与while 循环一致(breakcontinueelse)但是 for 循环使用起来更加简单高效,所以使用频率也更高。

    当设计及到循环取值的时候,一般会优先考虑使用 for 循环而不是 while 循环。

    name_list = ['jason', 'kevin', 'tony', 'tank', 'oscar']
    # 使用while循环依次打印出列表中所有的元素
    count = 0
    while count < 5:
        print(name_list[count])
        count += 1
        
    # 使用for循环依次打印出列表中所有的元素
    for name in name_list:
        print(name)
    '''
    jason
    kevin
    tony
    tank
    oscar
    '''
    # 循环字符串:依次取出每一个字符
    for i in 'hello world':
        print(i)
    '''
    h
    e
    l
    l
    o
     
    w
    o
    r
    l
    d
    '''
    # 循环字典(特殊):循环字典只能获取到字典的key value无法直接获取
    userinfo_dict = {'username': "jason", 'age': 18, 'gender': 'male'}
    for i in userinfo_dict:
        print(i)
    '''
    username
    age
    gender
    '''
    # 循环元组
    for i in (11, 22, 33, 44, 55):
        print(i)
    '''
    11
    22
    33
    44
    55
    '''
    # 循环集合:字典与集合内部的元素都是无序的 
    for i in {11, 22, 33, 44, 55, 66}:
        print(i)
    '''
    33
    66
    11
    44
    22
    55
    '''
    
  • range() 函数

    range() 函数返回数字序列,默认从 0 开始,默认以 1 递增,并以指定的数字结束。

    range() 函数在python2和python3中有所区分,在 python2 中range() 函数是直接产生一个列表,在元素较多时,会比较占用内存,而在python3中则是以一个 range(a, b) 来表示这个列表,对空间占用较小。

    但是 python2 中有个 xrange() 的功能与 python3 中的 range() 一样。

    # 用法1  括号内只写一个数字  默认从0开始  顾头不顾尾
    for i in range(5):
        print(i)
    '''
    0
    1
    2
    3
    4
    '''
    # 用法2  括号内写两个数字  自定义起始位置 顾头不顾尾
    for i in range(1, 5):
        print(i)
    '''
    1
    2
    3
    4
    '''
    # 用法3  括号内写三个数字  第三个数字表示的是等差数列的差值  默认情况下是1
    for i in range(1, 10, 2):
        print(i)
    '''
    1
    3
    5
    7
    9
    '''
    

数据类型的内置方法

  • int 整型

    1. 类型转换

      使用 int() 将括号中的字符串强制转换为整型。

      需要注意的是 int() 只能转换纯数字的字符串,也就是假如该字符串是小数、英文字母或者是符号之类的则无法转换。

    2. 进制转换

      bin() 可以将十进制转换为二进制

      oct() 可以将十进制转换为八进制

      hex() 可以将十进制转换为十六进制

      int() 也能将其转换回十进制。

  • float 浮点型

    浮点型的类型转换与整型类似,但是它可以转换整型和浮点型的字符串,依旧不能转换英文字母或者其他类型的字符串。

字符串内置方法

  1. 类型转换

    str() 可以转换所有基本数据类型。

  2. 索引与切片

    字符串的索引取值与列表相似,可以取出字符串中指定位次的字符串。与列表一样第一位从 0 开始。

    切片是索引的进阶,可以从指定位次开始,指定位次结束,依次取出字符串中的字符,与 range() 类似,顾头不顾尾。

    也可以在切片中加入步长,使其间隔取值。输入 2 表示隔一个取值,默认为 1 。

    索引和切片也可以倒着取,只要将参数加入 - 号,就可以与默认顺序相反的方向取值。

  3. 字符个数

    当计算字符串中字符的个数时可以使用 len() 函数。(空格也算一个字符)

  4. 成员运算

    可以使用成员运算 in 来判断字符串中是否存在指定字符或字符串。

  5. 移除字符串首尾指定字符

    .strip() 函数用于移除字符串首尾指定字符,当括号中为空时,默认移除空格。

  6. 按照指定字符切割字符串

    .split() 函数用于从左往右按照指定字符切割字符串。切割后可以列表存储,也可以进行解压赋值。可以使用 .rsplit() 从右往左切割。

总结

今天的内容基本上是新内容了,开始有点吃力,知识点愈发的多了,因为记不太住函数名,所以以后还是要多多使用。

作业

编写一个用户登录程序
要求最多尝试失误三次 过期自动提示并可重置尝试次数
用户登录成功之后进入内部循环 用户输入什么就打印什么 并给用户提供一个结束程序的特殊指令
获取用户输入的用户名和密码可以处理首尾空格
用户的用户名和密码使用变量存储 通过程序获取用户名和密码比对

chances = 1
is_again = False
data = 'jason|123'
username, password = data.split('|')
while chances <= 3:
    in_username = input('username:').strip()
    in_password = input('password:').strip()
    if username == in_username and password == in_password:
        print('登录成功,欢迎你,%s' % in_username)
        while True:
            cmd = input('>>>')
            if cmd == 'quit':
                print("再见,%s" % in_username)
                break
            else:
                print(cmd)
        break
    else:
        print('用户名或密码错误,剩余尝试次数为 %d 次' % (3 - chances))
        if chances == 3:
            while True:
                again = input('是否再次尝试 y/n')
                if again == 'y' or again == 'Y':
                    is_again = True
                    break
                elif again == 'n' or again == 'N':
                    break
                else:
                    print("请输入y/n")
                    continue
        chances += 1
        if is_again:
            chances = 1
            is_again = False

相关