摘要:二高级赋值语句何为高级赋值语句就是常规的赋值方法进行操作是会报错的,得进行一些更高级一点的操作。小技巧三举例用赋值语句把列表进行每次减少个元素并输出列表。
从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,20print(a)print(b)
运行结果:
1020
注意:等号两边的元素数量要相当,如果是a,b=10 或者a = 10,20 ,那么就会报错。
举例2:利用序列给另一个序列赋值
a,b = [20,30]print(a)print(b)
运行结果:
2030
a,b 默认是一个元组,[20,30]是一个列表,不同的序列类型之间也可以通过这种方式进行赋值。
何为高级赋值语句?就是常规的赋值方法进行操作是会报错的,得进行一些更高级一点的操作。比如说要把字符"SPAM"赋值给a和b,常规赋值是这样的:
s = "SPAM"a,b = sprint(a,b )
然后运行之后就会报错,字符串元素多于元组(a,b)里面的元素,直接复制是会报错的。
遇到这种情况,我们就需要用到切片的操作进行赋值了:
s = "SPAM"a,b = s[:3],s[2:] print(a,b )
运行结果:
SPA AM
除了用切片的方式,我们还可以用其他的方式给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进行赋值。
举例:用赋值语句把列表[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)
运行结果:
1 2 34 5 67 8 9
(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,并且剩下的元素都被封装成了列表。
既然上面我们讲了
a,*b = "字符串"
那么如果我们多加一个元素来赋值呢?又会如何?
a,*b,c = "abcdefg"print(a)print(b)print(c)
运行结果:
a["b", "c", "d", "e", "f"]g
可以看出来的是,还真给c留出来了一个对象并赋值,这个方法可以灵活运用。
如果说我们对调一下位置:
*b,a = "abcdefg"print(a,b)
运行结果:
g ["a", "b", "c", "d", "e", "f"]
可以看出,字符串的最后一个元素g还是赋值给了a,所以对调位置也是可以的,此时的a将会从后面取。
如果我们只给3个元素,但有4个元素要赋值,那么 * b 能拿到值吗?
a,c,*b,d = "abc"print(a,b,c,d)
运行结果:
a [] b c
结果b是1个空列表,因为字符串只有三个字符,不够给b,同样的,不管你怎么交换 * b 的位置,结果都一样,也就是说,会优先给其他元素赋值, 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. 减少代码量
这里我就不做举例了,这个我们经常用到,也很简单,知道它们有这个效果就可以了。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/122003.html
文章目录 强烈推荐系列教程,建议学起来!! 一.pycharm下载安装二.python下载安装三.pycharm上配置python四.配置镜像源让你下载嗖嗖的快4.1pycharm内部配置 4.2手动添加镜像源4.3永久配置镜像源 五.插件安装(比如汉化?)5.1自动补码神器第一款5.2汉化pycharm5.3其它插件 六.美女背景七.自定义脚本开头八、这个前言一定要看九、pyt...
摘要:例如,整数浮点数字符串等基本类型,就是字面量。所以,取出的字符串内容,并不能直接用作变量名,需要另想办法。总结抽象一下最初的问题,它实际问的是如何将字符串内容作为其它对象的变量名,更进一步地讲是如何将常量转化为变量。 前几天,我们Python猫交流学习群 里的 M 同学提了个问题。这个问题挺有意思,经初次讨论,我们认为它无解。 然而,我认为它很有价值,应该继续思考怎么解决,所以就在私密...
摘要:返回值,非必须,返回多个值使用逗号分隔即可。注意第一行末尾的分号无参数无返回值的函数该内容将演示函数的使用便捷性。函数的返回值可以赋值给一个变量,通过打印该变量,即可知道返回的具体内容。先学习一下局部变量与全局变量。 Python 学习的第一个难关 -- 函数,这个地方学会的人觉得没有啥,没学过的学的时候迷迷瞪...
阅读 2507·2021-10-09 09:44
阅读 617·2019-08-30 15:44
阅读 2974·2019-08-29 18:46
阅读 1084·2019-08-29 18:38
阅读 538·2019-08-26 10:44
阅读 2414·2019-08-23 16:07
阅读 1065·2019-08-23 15:38
阅读 4022·2019-08-23 14:02