鱼C论坛

 找回密码
 立即注册
查看: 1502|回复: 6

[技术交流] 【第10——16讲】列表、元组、字符串等序列

[复制链接]
发表于 2021-7-25 22:53:57 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Python初学者8号 于 2021-8-11 17:02 编辑

第10讲
h = ['小甲鱼', '黑夜', '迷途', '怡静', '秋舞斜阳']
s = [88,90,85,90,88]
m = []

做这个题目的时候我是会懵逼的

懵逼的原因是因为在使用insert插入member之后index会一直变
同时,append我虽然知道逻辑顺序,但是设计到循环的元素索引的时候我就蒙蔽

所以想一下问题的症结所在还是对于循环操作中的如何利用控制变量和元素index来实现append和insert算法有关系

既然看不出来,那就动手写一下过程就好了,直接写出每一次的操作就懂了

这个方法简单粗暴,其实也是一种思维过程吧,我觉得我好想找到一个蠢但是有用的方法来解决这种循环,i,j结合的那种以前会让我头疼的问题了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-8 11:20:47 | 显示全部楼层
还是很有感触的这个题目。

从上次自己认真消化了list tuple这些东西之后我再看题目还是会突然之间觉得有点不知所措,然后想了很久才解决这个问题,我一度对自己又产生了怀疑

但是至少到目前为止我发现了 一个很有效的方法就是,比如这个题目可以自己在纸上写出来——因为我想不清楚。

其实,只要搞清楚如何去做,就知道了如何去写,至于怎么写,还是一种技术问题,就比如我这里面使用的数组是[1,3,5,7,9]还是使用list(range(1,10,2)),

所以关键的地方在于思路,有了思路就可以去尝试使用方便的技术去实现!!!也即为,我的这个思路其实可以推广到很多其他的语言,当然要根据预压你的特点来实现,比如,结合py的特点就是使用insert和append了——也即为可以抽象出一个问题就是这样的间隔插入的算法问题。

所以,总结:遇到问题先分析,想不清楚写在纸上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-8 11:24:00 | 显示全部楼层
本帖最后由 Python初学者8号 于 2021-8-8 11:39 编辑

好了 两个问题我的解答是

方法一:
用append:
想法很简单。既然append是只能在末尾添加,那么办法,只能拆开member再来append grade咯
member = ['小甲鱼', '黑夜', '迷途', '怡静', '秋舞斜阳']
grade = [88, 90, 85, 90, 88]

total=[]
for n in range(0,5):
    total.append(member[n])
    total.append(grade[n])
print(total)
用insert:
这个稍微麻烦点想起来,不是很直观。首先写出最终形态,['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88],然后根据其index来研究。

就可以发现其实在member上面来insert就可以了,就是不断插队的感觉,只要是按照grade的先后顺序来插队,就不用担心index out  of range 的问题了
member = ['小甲鱼', '黑夜', '迷途', '怡静', '秋舞斜阳']
grade = [88, 90, 85, 90, 88]
for i,j in zip([1,3,5,7,9],grade):
    member.insert(i,j)
print(member)
方法二
我觉得这个更简单了,直接覆盖多简单啊,直接写,但是我想到这个,不用自己打字
member = ['小甲鱼', '黑夜', '迷途', '怡静', '秋舞斜阳']
grade = [88, 90, 85, 90, 88]
new = list(range(0,10))

for i,j in zip(range(0,10,2),range(0,5)):  # 0 2 4 6 8偶数开始是member 0 1 2 3 4   
    new[i]=member[j]
for i,j in zip(range(1,10,2),range(0,5)): 
就像军训报单数双数自己形成两列一样


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

使用道具 举报

 楼主| 发表于 2021-8-8 11:58:54 | 显示全部楼层
最后分析一下小甲鱼的方法:
方法一:
count = 0
length = len(member)
while count < length:
    print(member[count], member[count+1])
    count += 2

方法二:    
    
for each in range(len(member)):
    if each%2 == 0:
        print(member[each], member[each+1])
方法1和2其实实质是一样的,都是按照['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88]的index顺序去分析打印的元素的index,也即为
0,1
2,3
4,5
6,7
8,9
如此以来,就好办了,那就是打印出i,i+1了。

而至于i如何选取范围,那就是分析0 2 4 6 8序列本身的属性:偶数列就可以

那么实现方法无非就是:自己手打;利用index本身的属性去筛选;range(0,10,2)

而实际上,如果可以通过member本身能够提供的关于这个数列而不去增加新的内存占用(比如利用range方法或者手打一个02468),那么无疑是精简的

所以利用index得到02468很容易想到;

再者就是利用len让其自加,这个方法不好想到。至于这两个方法从代码量,执行速度以及数据结构的方面如何考虑,可以等我以后懂得多来来分析,哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-8 16:05:27 | 显示全部楼层
本帖最后由 Python初学者8号 于 2021-8-8 21:38 编辑

第11讲1.这个是不一样的哦!!
list1 = [1, 3, 2, 9, 7, 8]
id(list1[0])==id(list1[0:1])
记住,这个也是之前没有写进去的,单个index访问的时候是一个元素的值,对象是这个元素本身,而使用切片访问的时候访问的是一个列表,即使只有一个元素





并且要万分注意的是,list.sort()的方法也只是复制了一个列表,并且给予了不用的id。
list1 = [1, 3, 2, 9, 7, 8]
list2 = list1[:]
list3 = list1
print(id(list1))
print(id(list2))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-10 11:19:25 | 显示全部楼层
本帖最后由 Python初学者8号 于 2021-8-10 11:34 编辑

14讲:check.py

其实我觉得小甲鱼这个题目还是有漏洞的,尤其是低级的条件啊。无论是高中低级的几个限制条件应该是and的关系。否则按照123456789和123456789101112314s'这个输入,其实都不可行‘’

因此我决定这个题目我还是放弃,如果可以的话我自己有时间编写一个密码判定程序,他这个题目还是不合适


这是我的自己的代码
symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'
tip = "请按以下方式提升您的密码安全级别:\n\
    \t1. 密码必须由数字、字母及特殊字符三种组合\n\
    \t2. 密码只能由字母开头\n\
    \t3. 密码长度不能低于16位"

passwd= input('请输入需要检查的密码组合:')
# 判断首字符是否为字母
cd1 = (65 <= ord(passwd[0]) <= 90) or (97 <= ord(passwd[0]) <= 122)
# 判断长度 
cd2 = len(passwd)
# 判断成分
n,c,s = 0,0,0
for each in passwd:
    if each in nums:
        n = 1
    elif each in chars:
        c = 1
    elif each in symbols:
        s = 1
if (n,c,s)== (1,0,0) or (n,c,s)==(0,1,0 ):
    cd3 = 1
elif (n,c,s)== (1,1,0) or (n,c,s)==(1,0,1) or (n,c,s)==(0,1,1):
    cd3 = 2
elif (n,c,s)== (1,1,1):
    cd3 = 3
 
# 给出评估
if (0 <= cd2 <= 8) or (cd3 == 1 ):
    print('密码强度为低级',tip,sep='\n')
elif (8 <= cd2 <= 16) or (cd3 == 2 ):
    print('密码强度为中级',tip,sep='\n')
elif (cd2 >= 16) and (cd3 == 3 ) and (cd1 ==True):
    print('密码强度为高级')   

    
我只是尽量满足可行性和面型过程的编程思路。


                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图


当然这次的作业还是给我了一些帮助:
首先是思路,写程序思路比动手重要。思路的出现是结合技术的,就像我判断这个输入的password中的成分一样,我考虑过用string的方法,后来看了小甲鱼的觉得没必要了。
在思路中要搞清楚问题的性质——是评估问题。既然是评估就是要根据标准去判断,所以针对三个条件按照高中低的标准给出打分,然后再对号入座。这就是一个完整的思路

接下来解决步骤问题:输入密码——给出标准——判定打分——分级

紧接着就需要解决具体的技术问题:输入就是input,标准直接给出三个字符串len和passwd[0]的,打分就是针对三个条件然后按照条件语句来给出打分结果并得到一个数组,最后就是根据数组的种类打分

我这次做的很慢的地方就是:思路不清晰,缺少对问题的认知,然后就是循环和分支的不熟练,再者就是一些基础语法的问题。

针对思路问题可以慢慢来,先解决可行性问题,效率美观放在后面;
针对技术问题那就是多想多做吧

还有个启发就是,这次我使用Thoony进行了调试,让我对循环分支有了更直观的认识了,哈哈。if—else是顺序执行二选一结构,if-esif是前者升级版的顺序执行多选一;if-esif-else则是复合结构

有人给出了精简版的代码
symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'
tip = "请按以下方式提升您的密码安全级别:\n\
\t1. 密码必须由数字、字母及特殊字符三种组合\n\
\t2. 密码只能由字母开头\n\
\t3. 密码长度不能低于16位"

passwd= input('请输入需要检查的密码组合:')
# 判断首字符是否为字母
cd1 = passwd[0] in chars
# 判断长度
cd2 = len(passwd)
# 判断成分
n,c,s = 0,0,0
for each in passwd:
        if each in nums:
                n = 1
        elif each in chars:
                c = 1
        elif each in symbols:
                s = 1
cd3 = n+c+s

# 给出评估
if cd2 <= 8 or cd3 == 1 :
        print('密码强度为低级',tip,sep='\n')
elif cd2 >= 16 and cd3 == 3  and cd1 :
        print('密码强度为高级')
else:
        print('密码强度为中级',tip,sep='\n')

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

使用道具 举报

 楼主| 发表于 2021-8-11 11:46:08 | 显示全部楼层
第16讲:动动手
我自己写了一个min函数,sum函数也可以这样框架,而小甲鱼的dds的第二问题也就应对了这个缺陷

我的思路先判断再比较,分开进行的。

先完成了可行性,然后后面再回来看看优化的问题
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = ['W', 'D', 'N', 'M', 'D', 'Y', 'Z', 'P']
c = [5,'s',6,8,'d',9,5,1]

def minimum(ito):
    # 判定元素是否是同类型的
    cont = 0
    for c in ito:
        if str(c) in chars: # 是否含有字母
            cont = 1
            break
    for n in ito:
        if str(n) in nums:  # 是否含有数字
            cont += 1
            break
    if cont == 2:  # 如有两种则打印出错并且不进行后面的比价大小
        print(" '>' not supported between instances of 'str' and 'int'")
        
    else: # 完成了检验之后进行判断,此时才会有输出
        minn = ito[0]
        for each in ito:
            minn = each if each < minn else minn  # 第一个当做最小值,比他小就让位否则就算了
        return minn

if minimum(c) != None:
    print ('the minimum number of the parameter is {0}'.format(minimum(c)))

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 15:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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