RIXO 发表于 2018-8-16 20:54:01

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

今日学习至python第四课视频,未做习题

RIXO 发表于 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")

RIXO 发表于 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("游戏结束,不玩啦^_^")

RIXO 发表于 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")

RIXO 发表于 2018-8-16 22:52:13

看完第五课视频,未做课后练习

RIXO 发表于 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("游戏结束,不玩啦^_^")

RIXO 发表于 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('在程序限定的范围内找不到答案!')
'''

RIXO 发表于 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 in chars):
      print("高")
      print("请继续保持")
      break
    else:
      print("中")

    print("请按以下方式提升您的密码安全级别:\n\
    \t1. 密码必须由数字、字母及特殊字符三种组合\n\
    \t2. 密码只能由字母开头\n\
    \t3. 密码长度不能低于16位")
    break

RIXO 发表于 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')



RIXO 发表于 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))

RIXO 发表于 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))

RIXO 发表于 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


RIXO 发表于 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 != 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

RIXO 发表于 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)

RIXO 发表于 2018-8-29 23:22:02

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)

RIXO 发表于 2018-8-29 23:23:00

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

RIXO 发表于 2018-8-31 10:41:19

找到了错误,题目需要小写字母旁边有且只有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='')

RIXO 发表于 2018-9-3 15:38:29

发一下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()


RIXO 发表于 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 != 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: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)
      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
查看完整版本: 暂时还不能写日志就在帖子记录一下自己学习的进度吧