2

Python【赋值语句】专讲,可不能只会 a=b 啊!建议掌握!

 2 years ago
source link: https://blog.csdn.net/zhiguigu/article/details/120645793
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

从Python基础到高级编程学完,基本上Python入门的知识就已经学完了,为了给更多学完Python入门要过度到Python进阶方向(比如爬虫/后端/数据分析等等)的新手巩固好基础知识,专门做了一期关于Python新手入门时关于赋值语句的内容。

在Python当中,赋值有很多的方式,比如说变量、元组、列表等等的赋值都是不一样的,所以如果在赋值这一块模棱两可,可想而知后面的进阶内容,让你单独写代码也是会寸步难行的。

在这里插入图片描述

废话不多说,学而时习之,有则改之无则加勉。


一、常见赋值语句

我们来看看Python中常用的赋值语句有哪些:

方法解释a = 10基本形式a,b = 10,20元组赋值[a,b] = [10,20]列表赋值a,b = “AB”序列赋值a,b = [10,20]序列赋值a,*b = “hello”扩展的序列解包a = b = c =10多目标赋值a+=1增强赋值

序列是有序集的通用术语,在Python中,字符串、列表、元组、字节数组、缓冲区、Xrange对象均是属于不同的序列类型,也就是说(10,20)既可以说是1个元组,也可以说是1个序列。

举例1:利用1个元组给另一个元组赋值

a,b = 10,20
print(a)
print(b)

运行结果:

注意:等号两边的元素数量要相当,如果是a,b=10 或者a = 10,20 ,那么就会报错。

举例2:利用序列给另一个序列赋值

a,b = [20,30]
print(a)
print(b)

运行结果:

20
30

a,b 默认是一个元组,[20,30]是一个列表,不同的序列类型之间也可以通过这种方式进行赋值。


二、高级赋值语句

何为高级赋值语句?就是常规的赋值方法进行操作是会报错的,得进行一些更高级一点的操作。比如说要把字符"SPAM"赋值给a和b,常规赋值是这样的:

s = "SPAM"
a,b = s
print(a,b )

然后运行之后就会报错,字符串元素多于元组(a,b)里面的元素,直接复制是会报错的。

1.小技巧一

遇到这种情况,我们就需要用到切片的操作进行赋值了:

s = "SPAM"
a,b = s[:3],s[2:]   
print(a,b )

运行结果:

SPA AM

2.小技巧二

除了用切片的方式,我们还可以用其他的方式给a和b赋值:

s = "SPAM"
(a,b),c = s[:2],s[2:]
print(a,b,c )

运行结果:

S P AM

这种操作相当于在大元组((a,b),c)里面分了一个小元组(a,b),然后对a,b进行赋值。

3.小技巧三

举例:用赋值语句把列表[1,2,3,4,5]进行每次减少1个元素并输出列表。

l = [1,2,3,4,5]
while l :
    l = l[1:]
    print(l)

运行结果:

[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]

现有一个二维列表[[[1,2,3],[4,5,6],[7,8,9]] ,如何用序列赋值的方法进行输出列表里的每一个元素?方法如下:

s = [[1,2,3],[4,5,6],[7,8,9]]
for (a,b,c) in s:
    print(a,b,c)

运行结果:

(a,b,c)和 s 是不同类型的序列类型,通过序列赋值的方法也能够实现。


三、拓展的序列解包

前面的常见赋值语句表里面我们讲过拓展的序列解包操作:

方式解释a,*b = “hello”扩展的序列解包

那么它该如何使用?首先我们应该知道 *b 是有何用:

*b:获取分配完之后所剩的数据,封装成列表进行输出
a,*b = "abcdefg"
print(a)
print(b)

运行结果:

a
['b', 'c', 'd', 'e', 'f', 'g']

通过这个例子可以看出,a被第一个元素赋值,剩下的都给了b,并且剩下的元素都被封装成了列表。

1.小技巧一

既然上面我们讲了

a,*b = "字符串"

那么如果我们多加一个元素来赋值呢?又会如何?

a,*b,c = "abcdefg"
print(a)
print(b)
print(c)

运行结果:

a
['b', 'c', 'd', 'e', 'f']
g

可以看出来的是,还真给c留出来了一个对象并赋值,这个方法可以灵活运用。

2.小技巧二

如果说我们对调一下位置:

*b,a = "abcdefg"
print(a,b)

运行结果:

g ['a', 'b', 'c', 'd', 'e', 'f']

可以看出,字符串的最后一个元素g还是赋值给了a,所以对调位置也是可以的,此时的a将会从后面取。

3.小技巧三

如果我们只给3个元素,但有4个元素要赋值,那么 * b 能拿到值吗?

a,c,*b,d = "abc"
print(a,b,c,d)

运行结果:

a [] b c

结果b是1个空列表,因为字符串只有三个字符,不够给b,同样的,不管你怎么交换 * b 的位置,结果都一样,也就是说,会优先给其他元素赋值, b 的优先级最低,有时候会拿不到值*。

4.注意点:*b 不能直接赋值

有一个点我们需要注意一下,*b 是不能直接赋值的:

在这里插入图片描述

前面被赋值的对象只能是列表或者元组的序列类型,而 *b 单独存在时是不属于这种类型的。

这个时候我们如何改正它?很简单,把前面变成元组或者列表就可以了:

在这里插入图片描述

哪怕是加个逗号,*b都可以变成元组。

那么拓展的序列解包我们也来一个案例,我们还是用上面讲过的把列表[1,2,3,4,5]逐次减少1个元素并输出列表,这次我们用序列解包的方法来做:

l = [1,2,3,4,5]
while l:
    a,*l = l
    print(l)

运行结果:

[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]

那么前面高级赋值语句内容我们还讲过一个for循环输出二维列表的例子,那么for循环能不能也用带 * 的参数来进行赋值呢?答案也是可以的:

在这里插入图片描述


四、多目标赋值

多目标赋值的形式:

a = b = c = 10

这也是Python优雅的一个点所在,在底层逻辑是等号右边先给左边赋值,依次赋值,共用的是1个首地址,也就是说10先赋值给c,c的值变成了10,c再赋值给b,b再赋值给a,它们的地址都是一样的:

在这里插入图片描述


五、增强赋值

增强赋值运算不止有 += ,基础的时候我们还讲过:

+= -= *=  /= //= %= **=  

它们的作用主要是:

1. 执行效率高
2. 用于系统优化
3. 减少代码量  

这里我就不做举例了,这个我们经常用到,也很简单,知道它们有这个效果就可以了。

在这里插入图片描述


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK