最近在看《零压力学Python》,巩固一下基础知识,意外收获到很多常用却不一定被注意的小知识,分享给大家,学到东西了点赞支持哦~
第一篇:点击这里查看第一篇python小技能
第二篇:点击这里查看第二篇python小技能
个人微信公众号,欢迎关注领取学习资源
(1)字典
Python里字典(dict)是一种比较常用的数据结构,基本格式{key : values}
,key
和values
可以为任意类型,比如int
,str
等。
# 根据键可以轻松的索引获取的键值
dict_test = {'name':'XksA','age':22}
print('姓名:'+dict_test['name'])
print('年龄:'+str(dict_test['age']))
'''
result:
姓名:XksA
年龄:22
'''
# 字典遍历
dict_test = {'name':'XksA','age':22}
for k,v in dict_test.items():
print(k + ':' + str(v))
'''
result:
name:XksA
age:22
'''
dict_test = {'name':'XksA','age':22}
# 只取键
for k in dict_test.keys():
print(k)
print('-------------------')
# 只取键值
for v in dict_test.values():
print(str(v))
'''
result:
name
age
-------------------
XksA
22
'''
(2)集合
Python里集合(set),可以使用大括号 { } 或者 set() 函数创建,可以称为特殊列表,不能包含重复元素,另外需要注意:创建一个空集合必须用 set() 而不是 { },因为只用 { } 是用来创建,系统会默认为空字典。
# 集合基本操作
set_test = {1,2,3,4,5,6}
# 添加
set_test.add('XksA')
print('添加后:'+str(set_test))
# 删除
set_test.remove(2)
print('删除后:'+str(set_test))
# 求交、并、差集
set_a = {1,2,3,4}
set_b = {3,4,5,6}
print('a/b的交集:'+str(set_a & set_b))
print('a/b的并集:'+str(set_a | set_b))
print('a/b的差集:'+str(set_a - set_b))
'''
result:
添加后:{1, 2, 3, 4, 5, 6, 'XksA'}
删除后:{1, 3, 4, 5, 6, 'XksA'}
a/b的交集:{3, 4}
a/b的并集:{1, 2, 3, 4, 5, 6}
a/b的差集:{1, 2}
'''
特别提醒: 集合(set)是无序的,不支持排序,也不支持索引,如下面操作:
# 期望打印出集合set_b的第三个元素
print(set_b[2])
运行报错:TypeError: 'set' object does not support indexing
(3)小技能,模糊查找
# 基于字典的模糊查找
dict_txl = {'Mr.Zhang':'15799991234','Mr.XksA':'85320211','Miss.极简':'5220502'
,'WangW':'121331331','ZhangS':'121331331'}
while(True):
str_name = input("输入要查找人姓名(可模糊查找):")
for k,v in dict_txl.items():
if k.startswith(str_name):
print(k + ':' + v)
i = input("是否继续查找(y/n?):")
if i == 'n':
break
'''
result:
输入要查找人姓名(可模糊查找):Z
ZhangS:121331331
是否继续查找(y/n?):y
输入要查找人姓名(可模糊查找):Miss
Miss.极简:5220502
是否继续查找(y/n?):y
输入要查找人姓名(可模糊查找):M
Mr.Zhang:15799991234
Mr.XksA:85320211
Miss.极简:5220502
是否继续查找(y/n?):n
'''
startswith 函数
startswith函数用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False。如果参数 beg 和 end 指定值,则在指定范围内检查。
参数介绍
startswith(str, beg,end)
str -- 检测的字符串。
beg -- 可选参数用于设置字符串检测的起始位置。
end -- 可选参数用于设置字符串检测的结束位置。
(1)基本介绍
书上是这样说的“信不信由你,从开始阅读本书起,你就一直在使用Python对象”,我觉得,完全没毛病,你有对象吗?
差点忘了,我这个是小技能,就不太细的去讲这些理论性的东西了,下面图片简单介绍一下类与对象,觉得不错点个赞哦~
(2)创建类,创建对象,调用类方法
# 创建类
class Myclass():
# 创建类变量
my_variable = '极简XksA'
# 创建类函数
def my_function(self):
print("hello world!")
# 创建类对象
my_object = Myclass()
# 调用类变量
print(my_object.my_variable)
# 调用类函数
my_object.my_function()
'''
result :
极简XksA
hello world!
'''
(3)最重要的__init__()函数
Python里由“__”开始的和结尾的为保留字。
方法__init__是类最重要的方法之一,根据名字可以看出来,表示初始化,创建类对象的同时会自动调用这个方法,传参给类变量,通过__init__函数是个不错的选择或者说唯一选择。
# 创建类
class Myclass():
# 创建类变量
my_variable = '极简XksA'
# 初始化函数
def __init__(self,input_variable):
# 修改类变量my_variable值
self.my_variable = input_variable
print("hello world!")
# 创建类对象,传递参数
my_object = Myclass('老表')
# 调用类变量
print(my_object.my_variable)
'''
result :
hello world!
老表
'''
在Python中,一边循环一边计算的机制,称为生成器(Generator)。
也可以这样理解,生成器就是一个可以自动迭代的对象,类似于for循环,又比for循环灵活。
# 一般生成Fibonacci sequence
def get_fibos(n):
'''
根据n生成Fibonacci数,生成量由n决定
比如:n = 10,就会生成10个Fibonacci数,一次性
'''
a = b = 1
i = 0
while i < n :
i = i + 1
a,b = a+b , a
print(a)
# 修改成生成器
def get_fibos(n):
'''
把上面的print改成关键字:yield
函数执行到yield语句,就会停止本次运行,返回yield后的参数或语句
'''
a = b = 1
i = 0
while i < n:
i = i + 1
a, b = a + b, a
yield a
t0 = get_fibos(10)
print(t0)
for i in t0:
print(i)
result :
<generator object get_fibos at 0x0000021D112FC5C8>
2
3
5
8
13
'''
可以很明显看出t0是一个生成器,可迭代
'''
根据上面,我们大致了解到生成器就是一个可迭代的对象,用yield关键字可以实现,上面已经说了函数执行到yield语句,就会停止本次运行,返回yield后的参数或语句,等下次调用该函数时,会从上次暂停的地方开始继续运行迭代,你肯定会想,那生成器到底有什么用呢?
我们再来看一个实例:
# 生成整数范围内的奇数
def get_odd_num():
i = 1
while True:
yield i
i += 2
生成整数范围内的奇数,很多人会觉得,我直接也可以生成啊,为什么要用yield改成生成器呢?你有没有想过,整数内的奇数,虽然有一个范围,但是,也还是很多的哈,你用什么存储呢?生成器的好处就是,你需要多少个,或者说你需要哪一个,需要第几个,我就给你找到这个数,只要到了这个数,我就停下来休息,等你下次想找别的了,我再接着继续找,一样的找到就休息,所以这样我们就不用考虑,这么多数放哪个地方了。
再来一个高级实例收尾:
# 自己生成随机数
from time import time
def get_rand():
# 随机选择两个比较大的素数
p1 = 1200556037
p2 = 2444555677
# 限定最大随机数范围
max_rand = 2**32
# 获取随机数种子
r0 = int(time()*1000)
while True:
# 循环产生随机数
n = r0
n *= p2
n %= p1 # 第一次增强随机性
n += r0
n *= p2
n %= p1 # 第二次增强随机性
n %= max_rand # 控制随机数范围
r0 = n
yield n
思路比较简单,生成随机数,首先要有个随机数种子(初始值),然后对初始值进行一些随机操作,这里采用了扩大(与一个质数相乘),回原(与另一个质数取余),这样反复做了两次,最后与max_rand 取余,得出最终随机数,这样一顿骚操作保证了数据的随机性,中间操作要设计到恰到好处,比较难,像密码学老师说的“你加密,又加密,再加密,又再加密···很可能最后出来的就是明文了”。
最后介绍一下__next__()
函数,第一个实例就说了,生成器可以用for循环迭代,另外还有一个内置函数__next__
也是可以的,从名字可以看出就是调出下一个,示例如下:
# fibos数
def get_fibos(n):
a = b = 1
i = 0
while i < n:
i = i + 1
a, b = a + b, a
yield a
t0 = get_fibos(5)
print(t0.__next__())
print(t0.__next__())
'''
result :
2
3
'''
生成器给我最大的感受就是,我在使用的过程中,不用过多的考虑,这些数据可能会溢出,或者怎么样,让我更多的想我实现的功能怎么设计会漂亮一点,多看看,敲一下上面的实例代码,就理解了,别妄想着看一遍就能懂,也不要边看边抓头发,有闲时候多出去走走,多敲敲代码,看看电影,聊聊天,听听歌,看看书。。。(说多了,下次见:装饰器)
灵活应用这些基本操作,让你的工作学习事半功倍。