鱼C论坛

 找回密码
 立即注册
查看: 3478|回复: 22

[见证历程] 暂时还不能写日志就在帖子记录一下自己学习的进度吧

[复制链接]
发表于 2018-8-16 20:54:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今日学习至python第四课视频,未做习题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-8-16 22:40:34 | 显示全部楼层
自己第一次改进的多次文字游戏代码,因为发现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")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-16 22:45:37 | 显示全部楼层
这个是课后练习给出的代码, 使用了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("游戏结束,不玩啦^_^")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-16 22:51:25 | 显示全部楼层
这个是我吸取了课后答案后修改的版本,使用了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")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-16 22:52:13 | 显示全部楼层
看完第五课视频,未做课后练习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-17 23:28:44 | 显示全部楼层
第五课改进 后能让程序识别数据类型的 答案
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("游戏结束,不玩啦^_^")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-18 10:28:07 | 显示全部楼层

小游戏 求台阶
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('在程序限定的范围内找不到答案!')
'''
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-23 17:40:16 | 显示全部楼层
密码检测  这里我记不得判断字符串长度的函数了,所以没有写出来
# 密码安全性检查代码
#
# 低级密码要求:
#   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[0] in chars):
        print("高")
        print("请继续保持")
        break
    else:
        print("中")

    print("请按以下方式提升您的密码安全级别:\n\
    \t1. 密码必须由数字、字母及特殊字符三种组合\n\
    \t2. 密码只能由字母开头\n\
    \t3. 密码长度不能低于16位")
    break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-25 12:41:00 | 显示全部楼层
第十七讲的动动手
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')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-25 12:43:56 | 显示全部楼层
17讲答案中2的代码
这个代码在循环的时候相对简单多了,可以看出我在这里的逻辑并不是很好
def gcd(x, y):
    while y:
        t = x % y
        x = y
        y = t

    return x
    
print(gcd(4, 6))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-25 15:54:47 | 显示全部楼层

18课动动手1
def axiba(*p,base=3):
        if p[-1] != 5:
                print(sum(p)*base)
        else:
                base = 5
                print(sum(p[:-1]*base))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-25 16:28:48 | 显示全部楼层
用函数求水仙花数  循环部分比较麻烦,绕了好半天才算出结果

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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-29 16:43:44 | 显示全部楼层
本帖最后由 RIXO 于 2018-8-29 16:53 编辑

19讲动动手
这一讲的代码2 ,在使用判断字符串的方法时一定要加()不然会返回内存值,导致判断一直通过
代码 1 ,字符串没有reversed方法需要转换为列表再用,或者逐个字符判断
def couplet(temp):
    length = len(temp)
    for i in range(length-1):
        if temp[i] != 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-29 22:56:53 | 显示全部楼层

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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-29 23:22:02 | 显示全部楼层
20动动手2 ,这题的答案代码貌似是错的
先给出我的答案,其中我特意将符合条件的字符 和他的编号以及包含他前后3个字符的字符串都打印了出来
def findPassword(str1):
    length = len(str1)
    for a in range(length):
        if str1[a].islower():
            if a-3 >0 and a+3 <length-1:
                x = str1[a-3:a]+str1[a+1:a+4]
                if ( '\n' not in x) and  x.isupper():
                    print(str1[a],a)
                    print(str1[a-3:a+4])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-29 23:23:00 | 显示全部楼层
20动动手2
答案如下,看起来还挺麻烦的,不过有点困了,明天再研究它为什么会出错
countA = 0  # 统计前边的大写字母
countB = 0  # 统计小写字母
countC = 0  # 统计后边的大写字母
length = len(str1)

for i in range(length):
    if str1[i] == '\n':
        continue

    """
    |如果str1[i]是大写字母:
    |-- 如果已经出现小写字母:
    |-- -- 统计后边的大写字母
    |-- 如果未出现小写字母:
    |-- -- 清空后边大写字母的统计
    |-- -- 统计前边的大写字母
    """
    if str1[i].isupper():
        if countB:
            countC += 1
        else:
            countC = 0
            countA += 1

    """
    |如果str1[i]是小写字母:
    |-- 如果小写字母前边不是三个大写字母(不符合条件):
    |-- -- 清空所有记录,重新统计
    |-- 如果小写字母前边是三个大写字母(符合条件):
    |-- -- 如果已经存在小写字母:
    |-- -- -- 清空所有记录,重新统计(出现两个小写字母)
    |-- -- 如果该小写字母是唯一的:
    |-- -- -- countB记录出现小写字母,准备开始统计countC
    """
    if str1[i].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[i+1].isupper():
            countB = 0
            countC = 0
        else:
            print(str1[target], end='')
            countA = 3
            countB = 0
            countC = 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-31 10:41:19 | 显示全部楼层
找到了错误,题目需要小写字母旁边有且只有3个大写字母,而我的函数没有考虑大写字母多于三个的情况
看来是我的函数出了错误,这里放上修改后的函数
def findPassword(str1):
    length = len(str1)
    for a in range(length):
        if str1[a].islower():
            if a-3 >0 and a+3 <length-1:
                x = str1[a-3:a]+str1[a+1:a+4]
                z1 = str1[a-4:a]
                z2 = str1[a+1:a+5]
                if ( '\n' not in x) and  x.isupper():
                    if not (z1.isupper() or z2.isupper()) :
                        print(str1[a],end='')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-3 15:38:29 | 显示全部楼层
发一下26讲的动动手,非常有意思,代码很简单但是写起来的时候却觉得异常复杂,可以把重复的地方变简单
后续准备对它进行精简
值得注意的是列表和字典不需要用golobal就可以在函数内部进行添加和修改,这样安全性应该是有问题的,后期学习应该能找到解决方案
还有就是写代码的时候,很多时候需要判断之后重复判断,类似c语言的go语句,可以直接用while循环,比较好用
另外递归相当好用
userData ={}

def  userlanding():
    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[userId] = 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[userId]:
            code = input('密码输入错误,请重新输入密码:')
        
        print('欢迎进入系统!')
        print('\n\n\n')
        userlanding()

    if temp == 'Q' or temp == 'q':
        pass


userlanding()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-4 15:04:24 | 显示全部楼层
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[i] != file2[i]:
        count_lines +=1
        differences.append(i)


#输出有几处不同
print('两个文件一共有【%d】处不同'%count_lines)

#输出第几行不一样
for i in differences:
    print('第%d行不同'%(i+1))
    print(file1[i],file2[i])
动动手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)[line1_int:line2_int]:
    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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-5 19:51:25 | 显示全部楼层
本帖最后由 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)
        if  path.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更加麻烦,而且这里逻辑有点不清晰,觉得要把文件夹放到一个列表里面然后再递归,这导致了我后面的代码都相当繁琐,递归的时候逻辑不清晰,所以感觉想要回到上层目录又不知道能不能结束递归循环,总而言之是一个相当有意义的自己写的代码吧!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 15:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表