Python基础进阶:9个易错知识点

你好,我是kelly。

kelly根据自己平时工作,总结9个易错知识点,希望对大家有用。

知识点1:is 和=

is比较是两个变量地址是否相同,==比较是两个变量的值(内容)是否相同。

示例:

In [92]: a = [1, 2, 3]
In [93]: b = [1, 2, 3]In [94]: id(a)
Out[94]: 2799999236992In [95]: id(b)
Out[95]: 2799997311872In [98]: a is b
Out[98]: FalseIn [96]: a == b
Out[96]: True

a和b的内容相同,用id()函数可以查看变量地址,a和b的地址不同。

对上述例子做调整:

In [99]: a = [1, 2, 3]
In [100]: b = aIn [101]: id(a)
Out[101]: 2799998170496In [102]: id(b)
Out[102]: 2799998170496In [103]: a is b
Out[103]: TrueIn [105]: a == b
Out[105]: True

将一个变量赋值给另一个变量,本质上是起了另一个别名,前后2个变量指向同一个内存地址,地址和内容都相同。

知识点2:{}、{1,2,3}、set()的区分

{}创建的是空dic,{1,2,3}创建的是set,空set使用set()创建

示例:

In [39]: type({})
Out[39]: dictIn [40]: type({1,2,3})
Out[40]: setIn [41]: set()
Out[41]: set()In [42]: dict()
Out[42]: {}

使用{1,2,3}初始化集合set是一个特殊写法,注意和{}创建空字典dict做区别。

知识点3:函数参数的默认值使用可变数据类型

默认参数值只会在函数被执行时被赋值一次,参数默认值在内存始终存在,直至程序运行结束。

使用可变数据类型作为函数参数默认值,该参数值“可能”会在函数运行过程不断发生变化。

示例:

def add_sequence(value, lst=[]):lst.append(value)return lstIn [57]: add_sequence(100)
Out[57]: [100]In [58]: add_sequence(101)
Out[58]: [100, 101]In [59]: add_sequence(102)
Out[59]: [100, 101, 102]

函数参数lst使用可变数据类型list作为默认参数,多次运行函数,每次的参数lst值都不同。当程序逻辑复杂时,会引发各种bug。

建议不要使用列表作为函数参数的默认值,再看另外一个示例:

In [66]: def cal_sum(summation=[]):...:     summation.append(1)...:     return summationIn [67]: cal_sum()
Out[67]: [1]In [68]: cal_sum()
Out[68]: [1, 1]In [69]: cal_sum()
Out[69]: [1, 1, 1]

再次强调,默认参数值只会在函数定义被执行时被赋值一次。

知识点4:深拷贝、浅拷贝

在Python中,对象赋值实际是对象引用,前后两个变量所指向的是同一个地址(内存空间)。

变量赋值基础:变量A赋值给变量B,只是将变量A的引用给了变量B,并没有将变量A的值真正给变量B。

深、浅拷贝在复杂变量(list、dict,或者list、dict相关的各种嵌套)赋值时会发生问题。

浅拷贝

示例:

In [70]: a = [100, 101]...: b = a...: a[0] = 200In [71]: a
Out[71]: [200, 101]In [72]: b
Out[72]: [200, 101]

变量a改变了,b也同步变化。

看下a和b的内存地址:

In [73]: id(a)
Out[73]: 2799976453696In [74]: id(b)
Out[74]: 2799976453696

显然,a和b指向同个内存地址。

深拷贝

如果想要新变量的值不受赋值前的原变量的影响,需要对原变量执行深拷贝,这样可以创建一个完全新的变量,新变量会对原变量内部的对象进行级联拷贝。

深拷贝操作需要导入copy模块

示例:

In [75]: import copy...: a = [100, 101]...: b = copy.deepcopy(a)...: b[0] = 200In [76]: a
Out[76]: [100, 101]In [77]: b
Out[77]: [200, 101]In [78]: id(a)
Out[78]: 2799987225600In [79]: id(b)
Out[79]: 2799987318464

对变量a进行深拷贝deepcopy得到变量b,变量a和b任一一方的改动不会影响到另一方。

知识点5:f(x)与f(*x)调用

f(x):直接将变量实参x赋值给函数f的指定形参。

f(*x):x一般为序列,调用时会按照函数f的参数顺序,将序列x元素依次赋值给函数f的各个参数。

示例:

def f1(x):print("f1:", x)def f2(x1, x2, x3):print("f2:", x1, x2, x3)f1(100)
f2(*(100, 101, 102))

输出结果:

f1: 100
f2: 100 101 102

说明:f(*x)调用时,序列x的元素个数必须和函数f的形参数目一致。

def f2(x1, x2, x3, x4):print("f2:", x1, x2, x3)f2(*(100, 101, 102))

抛出异常:

TypeError: f2() missing 1 required positional argument: 'x4'

知识点6:*args 和 **kwargs

*args:接受序列作为输入

**kwargs:接受字典作为输入

在很多情况下,定义函数时无法确定真正调用时所传入参数的数目。对于这种情况,可变参数的机制允许函数调用时接受可变数量的参数。

在函数定义中,*args表示可以接受任意数量的位置参数,使用时将传入的位置参数打包成一个元组赋值给args。

**kwargs表示可以接受任意数量的关键字参数,使用时将传入的关键字参数打包成一个字典,赋值给kwargs。

示例:

In [62]: def show_func1(*args):...:     return argsIn [63]: show_func1("张三", "李四", "王五")
Out[63]: ('张三', '李四', '王五')In [64]: def show_func2(**kwargs):...:     return kwargsIn [65]: show_func2(name="张三", sex="男", age=31)
Out[65]: {'name': '张三', 'sex': '男', 'age': 31}

知识点7:可迭代对象、迭代器、生成器

可迭代对象

实现了__iter__()方法的对象,可以通过调用iter()函数返回一个迭代器对象。

可迭代对象可以是Python内置的容器对象(如列表、元组、集合、字典等),也可以是自定义的对象。

自定义的可迭代对象示例

class CustomIterableObject(object):def __init__(self):self.name = ["张三", "李四", "王五"]def __iter__(self):pass

什么都不做,仅仅实现了__iter__方法。

Python内置的可迭代对象示例:

In [80]: a = [100, 101, 102, 103]In [81]: hasattr(a, "__iter__")
Out[81]: TrueIn [82]: hasattr(a, "__next__")
Out[82]: False

上述列表a,是一个可迭代对象,但没有实现__next__方法,不是一个迭代器。

迭代器

Python中实现迭代协议的对象称为迭代器,本质上是一种数据结构。需要实现__next__()和__iter__()等方法。__iter__()返回迭代器自身,__next__()返回序列的下一个元素。

在每次迭代时,迭代器都会产生一个值,直到遍历完所有值。

可迭代对象和迭代器的区别:可迭代对象不是迭代器,可迭代对象可以通过iter()函数返回一个迭代器。

需要说明的是,可迭代对象不一定能被迭代,但迭代器一定是可迭代对象。

示例:

In [83]: a2 = iter(a)In [86]: a2
Out[86]: <list_iterator at 0x28bebd10880>In [84]: hasattr(a2, "__iter__")
Out[84]: True
In [85]: hasattr(a2, "__next__")
Out[85]: True

使用iter()函数得到一个迭代器a2,a2同时实现了__iter__()和__next__()两个方法。

生成器

是一种特殊类型的迭代器,它使用函数和yield关键字定义,可以像普通函数一样调用和执行。生成器在每次迭代时产生一个值,并在下一次迭代时恢复执行。

第一次调用生成器生成函数后,会返回一个生成器对象,可以在挂起和恢复状态中切换。生成器不会一次性生成整个序列,仅在每次调用时生成一个元素。生成器在内存使用和效率上更加优化,特别适合大型数据处理。

生成器和迭代器的区别:

1、实现方式不同:生成器用yield语句实现,创建迭代器需要实现__iter__()和__next__()方法。

2、生成数据方式不同:对于一个序列,生成器逐个生成元素,迭代器一次性生成整个序列,并存放在内存中。

3、执行方式不同:生成器使用函数方式调用,每次迭代时涉及到函数挂起和恢复;迭代器按照序列顺序,对各个元素依次执行。

知识点8:return、yield关键字

return是完全终止函数,并返回值。

yield是临时从函数内部返回值,得到生成器。

示例:

def get_return_value():for v in range(100, 105):return vdef get_yield_value():for v in range(100, 103):yield vIn [53]: value_yield = get_yield_value()...: for value in value_yield:...:     print(value)
100
101
102

知识点9:函数使用没有定义的全局变量

函数只执行读操作时,会直接使用全局变量的值。

函数执行写操作时,会报错,提示局部变量未定义。

示例:

读取全局变量

SUMMATION= 100def cal_sum1(a):print(SUMMATION)cal_sum1(10)

写全局变量

SUMMATION= 100def cal_sum2(a):SUMMATION += aprint(SUMMATION)cal_sum2(10)

抛出错误:

UnboundLocalError: local variable 'SUMMATION' referenced before assignment

如何修改全局变量?使用global关键字,

SUMMATION= 100def cal_sum2(a):global SUMMATIONSUMMATION += aprint(SUMMATION)cal_sum2(10)


本文原始版本发表链接:

https://mp.weixin.qq.com/s?__biz=MzI2Mjg3NTY5MQ==&mid=2247484561&idx=1&sn=b4b6213f8f9b2ca4a21b68ab8a02b4de&chksm=ea453bd5dd32b2c3aedc2058eebbad0204e0675b0642687234082bd8820483bed3e02e2cfbb6#rd

kelly会在公众号「kelly学技术」不定期更新文章,感兴趣的朋友可以关注一下,期待与您交流。
--over--

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2661709.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

全方面了解vcruntime140_1.dll的解决方法,多种vcruntime140_1.dll丢失的方法

在日常使用电脑时&#xff0c;我们常常遇到各种各样的问题。其中之一就是丢失vcruntime140_1.dll文件&#xff0c;这是一个重要的系统文件&#xff0c;会影响到电脑的正常运行。今天小编就来给大家详细的说说这一方面的咨询&#xff0c;教会大家多种的丢失vcruntime140_1.dll的…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《适应储能参与的调频辅助服务市场机制设计及调度策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主的专栏栏目《论文与完整程序》 这个标题涉及到储能技术在电力系统中参与调频辅助服务市场的机制设计和调度策略。下面对标题中的关键术语进行解读&#xff1a; 储能参与的调频辅助服务&am…

Cocos3D项目中fbx模型转gITF模型和glb模型

1.npm安装&#xff1a;先按照npm哈 npm install --save fbx2gltf -g 2. 到指定目录 cd C:\Program Files\nodejs\node_global\node_modules\fbx2gltf\bin\Windows_NT cmd命令行界面进入node_modules\fbx2gltf文件下的bin文件&#xff0c;然后根据平台选择进入相应目录&#…

元旦快到了,分享一些元旦祝福模板

元旦-王安石 爆竹声中一岁除&#xff0c;春风送暖入屠苏。 千门万户曈曈日&#xff0c;总把新桃换旧符。 元旦其实也是中国的传统节日了&#xff0c;不过元旦是由中国的春节演化而来的。传统的元旦时间是正月初一&#xff0c;从王安石的诗也能看的出来&#xff0c;其实描述的…

四川思维跳动商务信息咨询有限公司抖店开店可信吗

在当今的电商时代&#xff0c;越来越多的人选择在抖音平台上开设店铺&#xff0c;实现自己的创业梦想。然而&#xff0c;对于许多新手来说&#xff0c;如何顺利地在抖音上开店成为了他们面临的一大难题。四川思维跳动商务信息咨询有限公司作为一家专业的抖店咨询服务提供商&…

基于elemen二次封装弹窗组件

效果&#xff1a; 一、自定义内容类型弹窗 <!-- title&#xff1a;对话框的标题confirmLoading&#xff1a;当前是否处于提交中titleCenter&#xff1a;对话框标题居中方式footerCenter&#xff1a;底部按钮的对其方式visible&#xff1a;是否显示弹窗width&#xff1a;设置…

web自动化上传文件

1&#xff0c;web 自动化文件上传不要太简单 熟悉 web 自动化测试的大佬应该都懂&#xff0c;当采用 js 调用原生控件进行文件上传的时候&#xff0c;最常用的是使用 pywin32 等系统交互库。 当看到 pywin32 那丑陋的 api 封装只能爆粗口。就为了输入一个文件地址&#xff0c;…

MySQL HeatWave Lakehouse

在今年的Oracle Cloud World,Oracle宣布将发布一款数据库湖仓产品——MySQL HeatWave Lakehouse用以解决存储在数据库之外的文件数据等非结构化数据的查询和处理。 MySQL HeatWave是一个完全管理的数据库服务,将事务处理、分析处理和机器学习服务合并到一个MySQL数据库的云服务…

Linux中账号和权限管理

目录 一.用户账号和组账号&#xff1a; 1.用户账号类型&#xff1a; 2.组账号类型&#xff1a; 3.系统区别用户的方法 &#xff1a; 4.用户账号文件&#xff1a; 二.Linux中账户相关命令&#xff1a; 1.useradd&#xff1a; 2.passwd&#xff1a; 3.usermod&#xff1a…

Python爬取今日头条热门文章

前言 今日头条文章收益是没有任何门槛&#xff0c;只要是你发布文章&#xff0c;每篇文章的阅读量超过1000就能有收益&#xff0c;阅读量越多收益越高。于是乎我就有了个大胆的想法。何不利用Python爬虫&#xff0c;爬取热门文章&#xff0c;然后完成自动化发布文章呢&#xf…

24年软件测试的晋升之路与能力要求,“我“该何去何从?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、软件测试人员的…

1.DQL查询数据(超重点)以及distinct(去重)

DQL(Data Query Language:数据查询语言) 1.所有查询操作都用 SELECT 2.无论是简单的查询还是复杂的查询它都能做 3.数据库中最核心的语言&#xff0c;最重要的语句 4.使用频率最高的语句 语法&#xff1a; SELECT 字段1&#xff0c;字段2&#xff0c;……FROM 表 有时候…

CISP培训强化研发团队,确保金融科技发展安全无忧

​某金融科技公司是行业领先的平台服务商&#xff0c;凭借其在区块链、物联网、云计算、大数据和人工智能等尖端技术的卓越研发实力&#xff0c;致力于将前沿技术融入金融业务模式和应用场景。公司不断努力为客户提供一个“科技金融行业客户”的综合服务平台&#xff0c;从而实…

引领创业新风潮,花为缘享奢二手奢侈品买卖如何突出重围脱颖而出

数据显示&#xff0c;中国消费者的奢侈品消费金额占全球的份额从2000年的1%左右提升到2017年的33%。奢侈品消费的主战场仍是品牌发源地的欧洲和美国&#xff0c;中国消费者奢侈品消费规模全球第一。奢侈品逆势增长与持续涨价这件事&#xff0c;无疑预示着二级奢侈品转售市场将迎…

大数据引爆点:数据可视化的飞速发展

在信息时代&#xff0c;数据如潮水般涌入&#xff0c;企业和个人面临的挑战前所未有。而在这个数据的浩瀚海洋中&#xff0c;数据可视化如一道明亮的灯塔&#xff0c;引领着信息时代的航行者。近几年&#xff0c;数据可视化以其直观、生动的特性&#xff0c;迅速成为了信息表达…

2024年U.S.News全美最佳大学排名公布(附top100榜单)

9月18日&#xff0c;《美国新闻与世界报道》正式发布了最新的2024全美最佳综合大学排名。知识人网小编整理并附上top100的学校榜单&#xff0c;以供访问学者、博士后及联合培养博士们参考。 2024 US News 排名机制调整 U.S. News的排名综合考虑了包括录取率、师生比例、学生标…

嵌入式SOC之通用图像处理之OSD文字信息叠加的相关实践记录

机缘巧合 机缘巧合下, 在爱芯元智的xx开发板下进行sdk的开发.由于开发板目前我拿到是当前最新的一版(估计是样品)&#xff0c;暂不公开开发板具体型号信息.以下简称板子 .很多优秀的芯片厂商,都会提供与开发板配套的完善的软件以及完善的技术支持(FAE)&#xff0c;突然觉得爱芯…

win10安装ffmpeg

1 ffmpeg官网下载 官网地址&#xff1a;https://ffmpeg.org/ ffmpeg可执行程序下载地址&#xff1a;https://www.gyan.dev/ffmpeg/builds/ ffmpeg官网文档&#xff1a;https://ffmpeg.org/documentation.html 选择对应的版本点解下载可执行程序包&#xff0c;比如6.1版本的…

Linux操作系统(文件系统管理fdisk)

操作系统的两种启动模式Legacy BIOS 和 UEFI Legacy BIOS&#xff08;Basic Input/Output System,基本输入/输出系统&#xff09; 在开机时需要自检&#xff0c;启动过程较复杂。且传统的BIOS无法识别GPT&#xff08;GUID Partition Table&#xff09;分区表&#xff0c;只能识…

Windows上ModbusTCP模拟Master与Slave工具的使用

场景 Modbus Slave 与 Modbus Poll主从设备模拟软件与Configure Virtual Serial串口模拟软件使用&#xff1a; Modebus Slave 与 Modbus Poll主从设备模拟软件与Configure Virtual Serial串口模拟软件使用_modbus poll激活-CSDN博客 数据对接协议为Modbus TCP,本地开发需要使…