暂时还不能写日志就在帖子记录一下自己学习的进度吧
今日学习至python第四课视频,未做习题 自己第一次改进的多次文字游戏代码,因为发现temp是字符串而直接用int()函数会报错,但是又不能用isinstance(temp,int)函数来辨别输入的是字母还是数字而头痛,于是使用了异常捕捉,不过效果并不好,留待以后改进# -*- coding: cp936 -*-
import random
try:
print('-----------小游戏--------------')
temp = input('猜一个数字:')
guess = int(temp)
except:
temp = input('猜一个数字:')
#此处代码有问题,当输入两次字母时会报错
guess = int(temp)
answer = random.randint(1,100)
while guess != answer:
if guess < answer:
print("sorry,the answer is bigger")
else:
print("sorry,the answer is smaller")
temp = input('再猜一次吧:')
#此处有与上面同样的风险
guess = int(temp)
print("yes,you\'re very clever")
print("game over") 这个是课后练习给出的代码, 使用了print()函数绕过了input()需要在循环内外都写一遍的繁琐,解决了我上面代码的第二个问题,不过在输入第二个数字的时候没有文字显示,于是我改为仍然用input()加文字的形式,这个要注意的是guess变量需要在循环外定义
import random
times = 3
secret = random.randint(1,10)
print('------------------我爱鱼C工作室------------------')
guess = 0
print("不妨猜一下小甲鱼现在心里想的是哪个数字:", end=" ")
while (guess != secret) and (times > 0):
temp = input()
if temp.isdigit():
guess = int(temp)
if guess == secret:
print("我草,你是小甲鱼心里的蛔虫吗?!")
print("哼,猜中了也没有奖励!")
else:
if guess > secret:
print("哥,大了大了~~~")
else:
print("嘿,小了,小了~~~")
if times > 1:
print("再试一次吧:", end='')
else:
print("机会用光咯T_T")
else:
print("抱歉,您的输入有误,请输入一个整数:", end='')
times = times - 1 # 用户每输入一次,可用机会就-1
print("游戏结束,不玩啦^_^") 这个是我吸取了课后答案后修改的版本,使用了s.isdigit()函数判断是否是数字,写的时候问题出在对guess的判断上面,会忘记再次赋值一遍,导致一直要输入
但是需要判断guess还有temp 感觉还是比较麻烦,留待以后进行修改
import random
guess = 0
secret = random.randint(1,10)
while guess != secret:
temp = input('请输入一个1-10之间的数字:')
while not temp.isdigit():
temp = input('请输入一个数字:')
guess = int(temp)
while not (0<guess<11):
temp = input('请输入一个1-10之间的数字:')
guess = int(temp)
if guess < secret:
print("sorry,the answer is bigger")
elif guess > secret:
print("sorry,the answer is smaller")
print("yes,you\'re very clever")
print("game over") 看完第五课视频,未做课后练习 第五课改进 后能让程序识别数据类型的 答案
import random
times = 3
secret = random.randint(1,10)
print('------------------我爱鱼C工作室------------------')
guess = 0
print("不妨猜一下小甲鱼现在心里想的是哪个数字:", end=" ")
while (guess != secret) and (times > 0):
temp = input()
if temp.isdigit():
guess = int(temp)
if guess == secret:
print("我草,你是小甲鱼心里的蛔虫吗?!")
print("哼,猜中了也没有奖励!")
else:
if guess > secret:
print("哥,大了大了~~~")
else:
print("嘿,小了,小了~~~")
if times > 1:
print("再试一次吧:", end='')
else:
print("机会用光咯T_T")
else:
print("抱歉,您的输入有误,请输入一个整数:", end='')
times = times - 1 # 用户每输入一次,可用机会就-1
print("游戏结束,不玩啦^_^")
小游戏 求台阶
print('---------------------')
i=1
while True:
if i%2 == 1 and i%3 == 2 and i%5 == 4 and i%6 == 5 and i/7 == int(i/7):
print(i)
break
else:
i+=1
'''
课后练习给出答案如下
x = 7
i = 1
flag = 0
while i <= 100:
if (x%2 == 1) and (x%3 == 2) and (x%5 == 4) and (x%6==5):
flag = 1
else:
x = 7 * (i+1) # 根据题意,x一定是7的整数倍,所以每次乘以7
i += 1
if flag == 1:
print('阶梯数是:', x)
else:
print('在程序限定的范围内找不到答案!')
'''
密码检测这里我记不得判断字符串长度的函数了,所以没有写出来
# 密码安全性检查代码
#
# 低级密码要求:
# 1. 密码由单纯的数字或字母组成
# 2. 密码长度小于等于8位
#
# 中级密码要求:
# 1. 密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)任意两种组合
# 2. 密码长度不能低于8位
#
# 高级密码要求:
# 1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合
# 2. 密码只能由字母开头
# 3. 密码长度不能低于16位
symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'
passwd = input('请输入需要检查的密码组合:')
# 判断长度
length = len(passwd)
while (passwd.isspace() or length == 0) :
passwd = input("您输入的密码为空(或空格),请重新输入:")
length = len(passwd)
if length <= 8:
flag_len = 1
elif 8 < length < 16:
flag_len = 2
else:
flag_len = 3
flag_con = 0
# 判断是否包含特殊字符
for each in passwd:
if each in symbols:
flag_con += 1
break
# 判断是否包含字母
for each in passwd:
if each in chars:
flag_con += 1
break
# 判断是否包含数字
for each in passwd:
if each in nums:
flag_con += 1
break
# 打印结果
while 1 :
print("您的密码安全级别评定为:", end='')
if flag_len == 1 or flag_con == 1 :
print("低")
elif flag_len == 3 and flag_con == 3 and (passwd in chars):
print("高")
print("请继续保持")
break
else:
print("中")
print("请按以下方式提升您的密码安全级别:\n\
\t1. 密码必须由数字、字母及特殊字符三种组合\n\
\t2. 密码只能由字母开头\n\
\t3. 密码长度不能低于16位")
break 第十七讲的动动手
def power(x,y):
print(x**y)
def gcd (x,y):
if x<y:
pass
if x>y:
x,y =y,x
z = 1
while z != 0 :
z = y
y = x % y
x = z
z = y
print(x)
def biner (x):
z=1
str1 =''
while z!=0:
y = x % 2
z = x //2
x = z
str1 = str(y)+str1
print('('+str1+')B')
17讲答案中2的代码
这个代码在循环的时候相对简单多了,可以看出我在这里的逻辑并不是很好
def gcd(x, y):
while y:
t = x % y
x = y
y = t
return x
print(gcd(4, 6))
18课动动手1
def axiba(*p,base=3):
if p[-1] != 5:
print(sum(p)*base)
else:
base = 5
print(sum(p[:-1]*base))
用函数求水仙花数循环部分比较麻烦,绕了好半天才算出结果
def flower(x):
i = 100
while i<=x:
sum1 = 0
temp = i
while temp:
sum1 = sum1 +(temp%10)**3
temp //= 10
if sum1 == i:
print(sum1)
i+=1
本帖最后由 RIXO 于 2018-8-29 16:53 编辑
19讲动动手
这一讲的代码2 ,在使用判断字符串的方法时一定要加()不然会返回内存值,导致判断一直通过
代码 1 ,字符串没有reversed方法需要转换为列表再用,或者逐个字符判断
def couplet(temp):
length = len(temp)
for i in range(length-1):
if temp != temp[-(i+1)]:
print('不是回文联')
return
print('是回文联')
# temp = input('请输入一句话:')
# couplet(temp)
def count1(str1):
alphlet = 0
space = 0
num = 0
other = 0
for i in str1:
if i in 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm':
alphlet +=1
elif i.isdigit():
num +=1
elif i.isspace():
space +=1
else :
other +=1
return alphlet,num,space,other
def count(*str1):
length = len(str1)
i =1
for each in str1:
x,y,z,c = count1(each)
print('第%d个字符串共有:英文字符%d个,数字%d个,\
空格%d个,其他字符%d个。'%(i,x,y,z,c))
i +=1
20讲动动手1,这个特别有意思,然后我又修改了好半天
def findstr(str1):
x = []
y = ''
for a in str1:
if a in y:
y +=a
else:
if not a in x :
x.append(a)
count = str1.count(a)
if count < 10:
y += a
else:
if a =='\n':
print(r'\n一共出现了%d次'%count)
else:
print('%c一共出现了%d次'%(a,count))
print(y)
20动动手2 ,这题的答案代码貌似是错的
先给出我的答案,其中我特意将符合条件的字符 和他的编号以及包含他前后3个字符的字符串都打印了出来
def findPassword(str1):
length = len(str1)
for a in range(length):
if str1.islower():
if a-3 >0 and a+3 <length-1:
x = str1+str1
if ( '\n' not in x) andx.isupper():
print(str1,a)
print(str1)
20动动手2
答案如下,看起来还挺麻烦的,不过有点困了,明天再研究它为什么会出错
countA = 0# 统计前边的大写字母
countB = 0# 统计小写字母
countC = 0# 统计后边的大写字母
length = len(str1)
for i in range(length):
if str1 == '\n':
continue
"""
|如果str1是大写字母:
|-- 如果已经出现小写字母:
|-- -- 统计后边的大写字母
|-- 如果未出现小写字母:
|-- -- 清空后边大写字母的统计
|-- -- 统计前边的大写字母
"""
if str1.isupper():
if countB:
countC += 1
else:
countC = 0
countA += 1
"""
|如果str1是小写字母:
|-- 如果小写字母前边不是三个大写字母(不符合条件):
|-- -- 清空所有记录,重新统计
|-- 如果小写字母前边是三个大写字母(符合条件):
|-- -- 如果已经存在小写字母:
|-- -- -- 清空所有记录,重新统计(出现两个小写字母)
|-- -- 如果该小写字母是唯一的:
|-- -- -- countB记录出现小写字母,准备开始统计countC
"""
if str1.islower():
if countA != 3:
countA = 0
countB = 0
countC = 0
else:
if countB:
countA = 0
countB = 0
countC = 0
else:
countB = 1
countC = 0
target = i
"""
|如果前边和后边都是三个大写字母:
|-- 如果后边第四个字母也是大写字母(不符合条件):
|-- -- 清空记录B和C,重新统计
|-- 如果后边仅有三个大写字母(符合所有条件):
|-- -- 打印结果,并清空所有记录,进入下一轮统计
"""
if countA == 3 and countC == 3:
if i+1 != length and str1.isupper():
countB = 0
countC = 0
else:
print(str1, end='')
countA = 3
countB = 0
countC = 0
找到了错误,题目需要小写字母旁边有且只有3个大写字母,而我的函数没有考虑大写字母多于三个的情况
看来是我的函数出了错误,这里放上修改后的函数
def findPassword(str1):
length = len(str1)
for a in range(length):
if str1.islower():
if a-3 >0 and a+3 <length-1:
x = str1+str1
z1 = str1
z2 = str1
if ( '\n' not in x) andx.isupper():
if not (z1.isupper() or z2.isupper()) :
print(str1,end='')
发一下26讲的动动手,非常有意思,代码很简单但是写起来的时候却觉得异常复杂,可以把重复的地方变简单
后续准备对它进行精简
值得注意的是列表和字典不需要用golobal就可以在函数内部进行添加和修改,这样安全性应该是有问题的,后期学习应该能找到解决方案
还有就是写代码的时候,很多时候需要判断之后重复判断,类似c语言的go语句,可以直接用while循环,比较好用
另外递归相当好用
userData ={}
defuserlanding():
print('|--- 新建用户:N/n ---|')
print('|--- 登录帐号:E/e ---|')
print('|--- 退出程序:Q/q ---|')
temp = input('|--- 请输入指令代码:')
if temp == 'N' or temp == 'n':
print('请输入用户名:',end = ' ')
userId = input()
while userId in userData:
userId = input('此用户名已经被使用,请重新输入:')
print('请输入密码:',end =' ')
usercode = input()
userData = usercode
print('注册成功,赶紧试试登录吧 ^_^ ')
print('\n\n\n')
userlanding()
if temp == 'E' or temp == 'e':
userId = input('请输入用户名:')
while userId not in userData:
userId = input('您输入的用户名不存在,请重新输入:')
if userId == 'q':
print('\n\n\n')
userlanding()
code = input('请输入密码:')
while code != userData:
code = input('密码输入错误,请重新输入密码:')
print('欢迎进入系统!')
print('\n\n\n')
userlanding()
if temp == 'Q' or temp == 'q':
pass
userlanding()
29动动手
这一讲是我做习题以来最崩溃的一次
动动手0
#屏幕显示输入文件名
file_name = input('请输入文件名:')
while True:
#以xw打开一个可写入文件
try:
f = open(file_name+'.txt','x')
break
#如果报错,则重新输入文件名
except:
file_name = input('文件已存在,请重新输入文件名:')
#屏幕显示输入内容
print('请输入内容【单独输入‘:W’保存退出】:')
temp = input()
#while循环输入,当输入为:w的时候打破循环,然后关闭文件
while temp != ':w' and temp != ':W' and temp!=':w' and temp != ':W':
f.write(temp+'\n')
temp= input()
f.close()
动动手1
#获取第一个文件名
file_name1 = input('请输入一个需要比较的文件名:')
#获取第二个文件名
file_name2 = input('请输入另一个需要比较的文件名:')
f1 =open(file_name1,'r')
f2 =open(file_name2,'r')
differences =[]
count_lines = 0
#逐行判断是否有不同
file1 = list(f1)
file2 = list(f2)
for i in range(len(file1)):
if file1 != file2:
count_lines +=1
differences.append(i)
#输出有几处不同
print('两个文件一共有【%d】处不同'%count_lines)
#输出第几行不一样
for i in differences:
print('第%d行不同'%(i+1))
print(file1,file2)
动动手2
file_name = input('请输入要打开的文件(C:\\test.txt):')
lines = input('请输入需要显示该文件的前几行:')
line =int(lines)
while True:
if line < 0:
lines = input('请输入需要显示该文件的前几行:')
line =int(lines)
else:
break
f =open(file_name,'r')
print('文件%s的前%d行内容如下:'%(file_name,line))
while line:
print(f.readline())
line -= 1
动动手3
file_name = input('请输入要打开的文件(C:\\test.txt):')
lines = input('请输入需要显示的行数【格式如 13:21 或 :21 或21:】:')
(line1,line2) = lines.split(':',1)
flag = 0
if line1.isdigit():
line1_int = int(line1)
else:
line1_int = None
line1_str = '开始'
flag += 1
if line2.isdigit():
line2_int = int(line2)
else:
line2_int = None
line2_str = '末尾'
flag += 2
f =open(file_name,'r')
if flag == 0:
print('文件%s从第%d行到第%d行内容如下:'%(file_name,line1_int,line2_int),end ='\n\n')
elif flag == 1:
print('文件%s从开始到第%d行内容如下:'%(file_name,line1_int,line2_int),end ='\n\n')
elif flag == 2:
print('文件%s从第%d行到末尾内容如下:'%(file_name,line1_int,line2_int),end ='\n\n')
else:
print('文件%s的全文内容如下:'%(file_name,line1_int,line2_int),end ='\n\n')
for each_line in list(f):
print(each_line)
动动手4
这道题最难,难点在于忘记了列表方法里面有replace
file_name = input('请输入文件名(C:\\test.txt):')
f_read = open(file_name,'r')
old_word = input('请输入需要替换的单词或字符:')
new_word = input('请输入新的单词或字符:')
count = 0
content = []
for eachline in f_read:
if old_word in eachline:
count += eachline.count(old_word) #count感觉应该用这个
eachline = eachline.replace(old_word, new_word)
content.append(eachline)
print('文件 %s 中一共有%d个【%s】'%(file_name,count,old_word))
print('您确定要把所有的【%s】换成【%s】吗?'%(old_word,new_word))
answer = input('【YES/NO】')
if answer in 'YESyesYes':
f_write = open(file_name,'w')
f_write.writelines(content)
a = (line for line in open('动动手4.txt'))
for i in a:
print(i)
f_write.close()
本帖最后由 RIXO 于 2018-9-5 19:57 编辑
记录一下30讲文件系统的搜索文件
自己写的三组代码
import os
import pathlib
name = input('请输入要搜索的文件名:')
route = input('请输入要搜索的路径:')
save = []
def find_file(name,file_list):
for file in file_list:
if name in file:#判断是否有要搜索的文件,保存在新的列表中
dirname = os.path.dirname(os.getcwd())
save.append(dirname+file)
def loop(name,curdir,pardir=0):
os.chdir(curdir)
file_list = os.listdir(os.getcwd())
find_file(name,file_list)
dirname = os.getcwd()
folder =[]
for file in file_list:
file_path = dirname+'\\'+file
path = pathlib.Path(file_path)
ifpath.is_dir():
folder.append(file)
if folder == []:
if pardir ==0:
return None
else:
return os.chdir('..')
else:
for subdir in folder:
print(subdir,curdir,pardir)
loop(name,subdir,curdir)
loop(name,route+'\\')
for file_maybe in save:
print(file_maybe)
这个是一开始写的代码,特别麻烦,而且当时不知道os.path.isdir()就写的,所以用的是百度上的pathlib.Path更加麻烦,而且这里逻辑有点不清晰,觉得要把文件夹放到一个列表里面然后再递归,这导致了我后面的代码都相当繁琐,递归的时候逻辑不清晰,所以感觉想要回到上层目录又不知道能不能结束递归循环,总而言之是一个相当有意义的自己写的代码吧!
页:
[1]
2