学习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 循环一致(break、continue、else)但是 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 整型
-
类型转换
使用 int() 将括号中的字符串强制转换为整型。

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

-
进制转换
bin() 可以将十进制转换为二进制
oct() 可以将十进制转换为八进制
hex() 可以将十进制转换为十六进制

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

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

字符串内置方法
-
类型转换
str() 可以转换所有基本数据类型。

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

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

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

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

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

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

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

-
按照指定字符切割字符串
.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