Python学习日记07

目录

  • Day.07
    • 1.集合
    • 2.生成式和生成器
    • 3.今日总结

Day.07

2020.02.25
今天主要是系统性复习一下字符串、列表、元组、字典的知识,以及集合、生成式和生成器的学习。其中字符串、列表、元组、字典的函数方法前几天的日记中都已经提到,这里不再阐述,但是需要注意的一点是,元组和列表的区别:
虽然元组不能像列表那样修改元素,但是,元组的创建时间和占用空间上都优于列表,如果不需要对元素进行添加、删除、修改的话,肯定还是要优先选择元组的(因为在多线程环境中,不变的对象要比可变的对象更加容易维护,并且可以节省开销,还可以方便地被共享访问)。
接下来是今天的学习内容:

1.集合

python中的集合概念和数学中的集合一样,是一个无序不重复的序列,并且可以进行交集、并集、差集等运算。集合的创建可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
在进行集合运算的时候,既可以用python内置的方法来进行运算,也可以用运算符直接进行运算,比如:
交集:set1 & set2 == set1.intersection(set2)
并集:set1 | set2 == set1.union(set2)
差集:set1 - set2 == set1.difference(set2)
两个集合中不重复的元素集合:set1 ^ set2 == set1.symmetric_difference(set2)
判断子集和超集:
set2 <= set1 == set2.issubset(set1)
set1 >= set2 == set1.issuperset(set2)
两者的结果是一样的,但是我个人倾向于使用运算符进行运算,因为更加直观。还有一些集合的其他内置方法,这里用表格作为总结(以上提到的方法不再列出):

方法 描述
add() 为集合添加元素
clear() 移除集合中的所有元素
copy() 拷贝一个集合
difference_update() 移除集合中的元素,该元素在指定的集合也存在
discard() 删除集合中指定的元素
intersection_update() 返回集合的交集
isdisjoint() 判断两个集合是否包含相同的元素,如果没有返回True,否则返回False
pop() 随机移除元素
remove() 移除指定元素
symmetric_difference_update() 移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中
update() 给集合添加元素

2.生成式和生成器

这里推荐在学习Python-100-Days的时候和牛客网python3教程相对应的迭代器与生成器的这一节内容一起看,会理解得更加清楚。但是因为迭代器和生成器的内容涉及面向对象的编程,所以在这里作初步了解即可,将来还会细讲。
首先,生成式是指在创建列表或者元组时,直接在括号内部输入算法生成,比如:
f = [x for x in range(1,10)] 或者 f = [x+y for x in ‘ABCDE’ for y in ‘1234567’]
因为用这种语法创建列表时,元素已经准备就绪,所以需要耗费较多的内存空间。
然后引入迭代器和生成器的概念:迭代器是一个可以记住遍历的位置的对象,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。迭代器有两个基本方法iter()和next(),其中,iter()用于创建迭代器对象(或者说返回一个特殊的迭代器对象),next()则用于返回下一个迭代器对象。
而使用了yield的函数则被称为生成器,跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。调用一个生成器函数,返回的是一个迭代器对象。
所以同样的一个语法如果把列表改造成生成器,那么它将大大减少存储数据的空间。比如:将原本的生成式语句f = [x ** 2 for x in range(1, 1000)]改造成生成器语句f = (x ** 2 for x in range(1, 1000))。
然后是今日的练习题:

#练习题1:在屏幕上显示跑马灯文字
#具体实现方法:
import os
import time


def main():
    content = '北京欢迎你为你开天辟地…………'
    while True:
        # 清理屏幕上的输出
        os.system('cls')  # os.system('clear')
        print(content)
        # 休眠200毫秒
        time.sleep(0.2)
        content = content[1:] + content[0]


if __name__ == '__main__':
    main()
#测试结果:
#北京欢迎你为你开天辟地…………
#京欢迎你为你开天辟地…………北
#欢迎你为你开天辟地…………北京
#迎你为你开天辟地…………北京欢
#你为你开天辟地…………北京欢迎
#为你开天辟地…………北京欢迎你
#你开天辟地…………北京欢迎你为
#开天辟地…………北京欢迎你为你
#天辟地…………北京欢迎你为你开
#辟地…………北京欢迎你为你开天
#地…………北京欢迎你为你开天辟
#…………北京欢迎你为你开天辟地
#………北京欢迎你为你开天辟地…
#……北京欢迎你为你开天辟地……
#…北京欢迎你为你开天辟地………
#北京欢迎你为你开天辟地…………
#京欢迎你为你开天辟地…………北
#欢迎你为你开天辟地…………北京


#Process finished with exit code -1

小结:这一题涉及到的知识盲区太多了,我没写出来,这是GitHub上的答案。其中os模块主要用于处理系统的文件和目录,os.system(‘cls’)是清屏的效果。而time模块提供各种与时间相关的函数,time.sleep(secs)的作用是在给定的秒数内挂起调用线程的执行。此外,我查阅资料了解到os.system(‘cls’)在cmd上执行的话其实是会有一个返回值0,如果没有变量接收这个返回值,就会输出在命令行窗口,解决的办法就是将其返回值给一个变量,比如:i = os.system(‘cls’)。在IDLE下的清屏的话,就比较简单,不需要用到os.system(‘cls’),用特定的按键即可。以我用的PyCharm为例,在终端左边点击Clear All即可实现清屏。而time.sleep(secs)方法则更像是一个定时器,可以精确给定延迟的时间,如果不加这个函数,则会瞬间跳出字符串的滚动。
跑马灯的原理就是字符串的切片然后再拼接起来即可:从1位置切到最后,再在末尾加上原来的0位置即可。

#练习题2:设计一个函数产生指定长度的验证码,验证码由大小写字母和数字构成
#具体实现方法:
import random


def yanzhengma(x):
    list1 = [a for a in 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz']
    list2 = [b for b in range(10)]
    list3 = list1 + list2
    print('验证码为:', end='')
    for c in range(x):
        print((random.sample(list3, x))[c], end='')
    print(end='\n')


if __name__ == '__main__':
    while 1:
        x = int(input('请输入验证码的位数:'))
        yanzhengma(x)
#测试结果:
#请输入验证码的位数:4
#验证码为:jhkD
#请输入验证码的位数:5
#验证码为:OWrAz
#请输入验证码的位数:6
#验证码为:E9gXJm
#请输入验证码的位数:4
#验证码为:bNav
#请输入验证码的位数:
#Process finished with exit code -1

小结:具体思路就是形成一个包含大小写字母和数字的列表,然后使用random模块中的sample函数,因为这个函数有两个参数,一个是population,一个是k。其中population指定所要产生随机序列的原序列,k指定所要产生随机序列的位数,在本题中通过函数参数x输入。本题其实还有优化的地方,比如可以通过ASCII码的范围来产生一个包含大小写字母和数字的列表,但是需要额外的内容,将来学到了会重新补充到这里(需要导入numpy模块)。

3.今日总结

今天因为下午党支部要开在线会议,晚上要试运行网课,所以花费了比较多的时间,前面这两个练习题和知识点也是在空余的时间赶忙写出来的,所以说今日份的内容今天没有学完,可能需要分几天来学了。今天只做了两个练习题的主要原因是:一来是没有太多的时间深入学习,二来是题目确实都和前几天相比难度有所上升,需要仔细钻研,因为涉及到很多特殊模块的知识没有学到。

你可能感兴趣的:(Python学习日记)