【学习笔记】python基础知识与python拆包、装包

自闭症网瘾萝莉.ら 提交于 2020-01-23 00:25:13

最近放假,闲的没事在家学python,然后做了点笔记方便自己以后回顾
这篇笔记都是一些零散的基础知识点,因为个人理解不同,所以不会很全面,望海涵

三引号

这是python的一个用来注释或者是保留格式的符号,用法与单、双引号类似,只是无法进行单双引号的嵌套,三引号占用的内存空间也与单、双引号不同(在写的东西不在同一行的情况下),例:

'''
	   如果是单独拿出来,没有用一个变量(容器)去接受这串字符串,python解释器则会把三引号与三引号里面的文字,
	当成注释来使用,效果与python的'#' 注释是一样的,三引号的注释为python的多行注释效果
'''

str = '''
	如果想输出的文字保留原有的格式
	像这样,可以使用三引号包裹文字
'''
# 此时的type(str)为<class 'str'>,既为python的字符串类型
三目运算符

python有自己独有的三目运算符的方式,既 结果 = 判断为真执行的语句 if 判断式 else 判断为假的执行语句,个人认为比js的三目运算符结构看起来比较对称(不愧是强迫症患者设计出来的语言),例:

 a = 6 
 b = 5
 result = (a+b) if a>b else (a-b)
 print(result) # 此时的result会打印出11,因为 a>b判断为真,执行的是(a+b)的语句
pass

python自己的占位符,因为python是一种对缩进严格的语言,pass为空语句,只要有缩进而缩进的内容还不确定时,此时为了保证语法的正确性,就可以是用pass占位,不会出现语法错误,所以在有些时候只想搭个架子,以后再慢慢详细的时候可以使用pass进行占位,例:

if 10 > 7:
     print('10是大的')
else:
     pass    # 在不知道写什么的情况下,可以用pass占位确保语法正确
print('---判断结束---')
for…else…

应该很多初学python的小伙伴看到for循环还能接else的时候,和我一样也是一脸懵逼,简单来说就是在一个for循环中,当最后循环结束,没有数据的时候,就会执行else里的语句,在有数据的时候还是会执行for中的语句,例:

name = 'odd'
num = int(input('请输入需要的馒头的数量:'))

for i in range(num):
    print('{}很饿,正在吃第{}个馒头'.format(name,i+1))       # 有数据走这
else:
    print('{}吃饱了'.format(name))     # 没数据走这

# 如果num = 3,则此时会输出:
# odd很饿,正在吃第1个馒头
# odd很饿,正在吃第2个馒头
# odd很饿,正在吃第3个馒头
# odd吃饱了
漏删问题

在对列表进行查找删除的时候,我发现了一个漏删的问题,先看下面一段代码:

words = ['hello','goods','gooo','world','digot','alpha']
word = 'go'
i = 0
length = len(words)

while i < length:
    if word in words[i]:
        del words[i]
        length -= 1

    i += 1
print(words) # ['hello', 'gooo', 'world', 'alpha']

此时words打印出来的值为[‘hello’, ‘gooo’, ‘world’, ‘alpha’],会发现,'gooo’里面也含有’go’啊,怎么会没被删掉?经过debug后我发现,是因为在删掉 ‘goods’ 后,序号计数器 i 仍会继续+1。

如果我们为开始的6个单词进行编号,0,1,2,3,4,5,则在删掉序号为1的 ‘goods’ 时,因为长度 -1,此时会对其他5个单词重新排序,原来序号为2的’gooo’在重新排序后,序号变为1,而此时的序号计数器 i 已经从1 +1 变为2,则下次循环会从序号为2的单词开始判断,就会发现序号变为1的 ‘gooo’ 被跳过而漏删了

这应该是一个很简单的漏删问题,只是之前写的时候没太注意到,见笑了
解决方法也很简单,只需要在length -=1后加上continue跳过下面代码不执行,直接执行下一次循环即可,例:

words = ['hello','goods','gooo','world','digot','alpha']
word = 'go'
i = 0
length = len(words)

while i < length:
    if word in words[i]:
        del words[i]
        length -= 1
		continue  # 跳过下面代码不执行直接下一次循环
		
    i += 1
print(words) # ['hello', 'world', 'alpha']
类型转换

单整数类型是不可以放进 list() 里的,因为单整数类型不可迭代对象
for…in…里面可以循环的类型既为可迭代对象,可以放进 list() 里进行类型转换

快速交换

与其他语言交换方式不同,python可以不通过第三个变量而进行两个变量间的值交换,例:

a = 6
b = 5
print(a, b)  # 6 5
a, b = b, a
print(a, b)  # 5 6
修改列表里的值

如果要对一个列表进行操作的话,要先把这个列表转为enmu枚举类型,通过list[index]修改这列表里的元素的值
例:

list1 = [1,2,3,4,5]

for index,i in enumerate(list1):
    list1[index] += 5
    print(list1[index])

print(list1)
# 6
# 7
# 8
# 9
# 10
# [6, 7, 8, 9, 10]
拆包、装包

拆包这个词虽然以前不知道在哪听过,但是一时想不起来(好像是tcp的拆包?)

拆包:是对于可迭代对象,如元组、列表、字符串、集合、字典这些可迭代对象都可以被拆包,拆包是指将一个结构中的数据拆分为多个单独变量中。
拆包的方式大致有两种,一种是以变量的方式来接收,另一种是用* 号拆包。例:

# 元组拆包
tuple1 = (1, 2, 3, 4)
a, b, c, d = tuple1
print(a, b, c, d) # 1 2 3 4
print(*tuple1) # 1 2 3 4

# 列表拆包
list1 = [1, 2, 3, 4]
a, b, c, d = list1
print(a, b, c, d) # 1 2 3 4
print(*list1) # 1 2 3 4

# 字典拆包
dict1 = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
x, y, z, h = dict1
print(x, y, z, h) # a b c d
print(*dict1) # a b c d

# 字符串拆包
str = '1234'
a, b, c, d = str
print(a, b, c, d) # 1 2 3 4
print(*str) # 1 2 3 4
print(type(a)) # <class 'str'>

要注意的是,对字典进行拆包,只会将字典里每一项的key值赋值给拆包对象,value值是不会被赋值的,而对字符串进行拆包,即使是打印出来的是数字,其类型仍为字符串类型

装包:在拆包的过程中,如果系统看到*,既将上述对象在系统底层通过一个列表[ ],将其装起来成为一个列表对象。例:

tuple1 = (1, 2, 3, 4)
a, *b, c = tuple1
print(a) # 1
print(b) # [2,3]
print(c) # 4

由上述代码我们可以看到,使用a, *b, c三个变量对一个tuple1元组进行拆包,因为变量个数与元组长度不一致,则会根据变量的位置关系,先把tuple1中 1、4的值拆包赋给a、c,然后将剩余的值拆包赋给b。
此时系统看到b前面有一个 * 号,则会将tuple1中2、3的值使用一个列表[ ]进行装包,再将该列表的值赋给b,所以我们看到b打印的结果为 [2,3]

值得注意的是:当装包的变量个数大于被拆包的对象长度时,会先根据没有 * 号在前的变量进行拆包,
再对有 * 号在前的变量进行装包,此时装包会装进一个空列表,如:

tuple1 = (1, 2, 3)

*a, b, c, d = tuple1
print(a, b, c, d) # [] 1 2 3

a, b, c, *d = tuple1
print(a, b, c, d) # 1 2 3 []

a, *b, c, d = tuple1
print(a, b, c, d) # 1 [] 2 3

a, b, *c, d = tuple1
print(a, b, c, d) # 1 2 [] 3

当然python函数里面的可变参数也涉及拆包、装包,这个就写在python函数篇里好了

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!