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://www.mzph.cn/news/583976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2分钟明白什么是SCADA?

SCADA——数据采集和监控系统的英文缩写&#xff0c;国内流行的叫法是&#xff0c;监控组态软件&#xff0c;是生产控制的核心&#xff0c;是位于控制设备之上&#xff0c;侧重于管理的纯软件&#xff0c;在ERP/MES/PCS架构中起承上启下的作用。SCADA负责控制或监控整个工厂&am…

uniapp路由

1、路由登记 uni-app页面路由为框架统一管理&#xff0c;开发者需要在pages.json里配置每个路由页面的路径及页面样式。 类似小程序在 app.json 中配置页面路由一样。 所以 uni-app 的路由用法与 Vue Router 不同&#xff0c;如仍希望采用 Vue Router 方式管理路由&#xff0c;…

九州金榜|教育孩子小技巧--给孩子讲故事

百年大计&#xff0c;教育为本。对于孩童来讲&#xff0c;故事无疑是最好的教育方法&#xff0c;通过一个个引人入胜的小故事将其中蕴含的道理、经验、哲理、观念传递给孩子。 可以这么说&#xff0c;故事对于儿童获取词汇储备、洞察能力、处事方法、情商和智力的提升都有着极为…

Go 语言如何读取 excel 测试数据,简单易学

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

算法基础day2

前缀和 #include <iostream> using namespace std; const int N100010; int n,m; int a[N],s[N]; int main() {scanf("%d%d",&n,&m);for(int i1;i<n;i) scanf("%d",&a[i]);for(int i1;i<n;i) s[i]s[i-1]a[i];while(m--){int l,r;s…

Gooxi亮相2023中国数据与存储峰会展示最新存储解决方案

今日&#xff0c;以“数智创新&#xff0c;AI未来”为主题的2023 中国数据与存储峰会在北京顺利举行&#xff0c;Gooxi受邀参与并展示了最新存储服务器产品&#xff0c;搭配最新处理器平台&#xff0c;能够广泛应用在人工智能、数据分析、云端计算、数据存储和高性能计算等领域…

兔子目标检测数据集VOC格式3900张

兔子是一类可爱的哺乳动物&#xff0c;拥有圆润的脸庞和长长的耳朵&#xff0c;身体轻盈柔软。它们通常是以温和和友善的形象出现在人们的视野中&#xff0c;因此常常成为童话故事和卡通形象中的角色。 兔子是草食性动物&#xff0c;主要以各种草本植物为食&#xff0c;包括草…

python查找mongo中符合条件的json记录

一、需求&#xff1a; 之前有次需要临时查找mongo中存储的json串&#xff0c;符合特定条件的记录&#xff1b; 举个例子&#xff0c;mongo中记录如下图&#xff1a; 其中每条存储的数据大概为&#xff1a; [{"createUser": "Zxtech","paramName&qu…

NFC与ZigBee技术在智慧农业物联网监测系统中的应用

近年来&#xff0c;我国农业物联网技术飞速发展&#xff0c;基于物联网技术的智能农业监测系统有望得到较大规模的推广应用。但传统的物联网农业监测系统其网络结构层次单一&#xff0c;多采用基于有线或无线结构的节点-上位机数据采集模式&#xff0c;节点数据访问模式缺乏灵活…

【Leetcode 39】组合总和 —— 回溯法

39. 组合总和 给你一个无重复元素的整数数组candidates和一个目标整数target &#xff0c;找出candidates中可以使数字和为目标数target的 所有不同组合&#xff0c;并以列表形式返回。你可以按**任意顺序 **返回这些组合。 candidates中的同一个数字可以 无限制重复被选取 。…

喜讯丨智安网络实力上榜《嘶吼2023中国网络安全产业势能榜》

近日&#xff0c;嘶吼安全产业研究院正式发布《嘶吼2023中国网络安全产业势能榜》。智安网络凭借在网络安全行业领先的产品实力、专业的安全服务水平及多年累积的行业经验&#xff0c;从300余家厂商中脱颖而出&#xff0c;成为《中国网络安全产业势能榜》互联网行业势能厂商。 …

ACM32F403/F433 12 位多通道国产芯片,支持 MPU 存储保护功能,应用于工业控制,智能家居等产品中

ACM32F403/F433 芯片的内核基于 ARMv8-M 架构&#xff0c;支持 Cortex-M33 和 Cortex-M4F 指令集。芯片内核 支持一整套DSP指令用于数字信号处理&#xff0c;支持单精度FPU处理浮点数据&#xff0c;同时还支持Memory Protection Unit &#xff08;MPU&#xff09;用于提升应用的…

mac node基本操作

1 查看所有版本 npm view node versions输出 2 查看已经安装的版本 n list3 安装指定版本 sudo -E n 16.0.04 切换版本 sudo n 16.0.05 查看版本 node -v

HTML+CSS+JS网页设计期末课程大作业 web课程设计 web前端开发 网页规划与设计

HTMLCSSJS网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计 &#x1f4a5; 文章目录一、&#x1f6a9; 网站描述二、&#x1f38c; 网站介绍三、&#x1f3f4; 网站类型A 个人博客主题B 人物明星主题C 旅游主题D 游戏主题E 动漫主题F 美食主题G 校园主题H 企…

vue项目移动端点击图片放大预览(可拖拽,放大)

1.下载依赖 npm install vue-photo-preview -S 2.引入 main.js 中全局引入 import preview from vue-photo-preview import vue-photo-preview/dist/skin.css Vue.use(preview) 3. 应用 给图片加上 preview"0" 分组 <img preview"0" style"…

【XR806开发板试用】XR806串口驱动CM32M对小厨宝的控制实验

一.说明 非常感谢基于安谋科技STAR-MC1的全志XR806 Wi-FiBLE开源鸿蒙开发板试用活动,并获得开发板试用。 XR806是全志科技旗下子公司广州芯之联研发设计的一款支持WiFi和BLE的高集成度无线MCU芯片&#xff0c;支持OpenHarmony minisystem和FreeRTOS&#xff0c;具有集成度高、…

用通俗易懂的方式讲解大模型:基于 LangChain 和 ChatGLM2 打造自有知识库问答系统

随着人工智能技术的迅猛发展&#xff0c;问答机器人在多个领域中展示了广泛的应用潜力。在这个信息爆炸的时代&#xff0c;许多领域都面临着海量的知识和信息&#xff0c;人们往往需要耗费大量的时间和精力来搜索和获取他们所需的信息。 在这种情况下&#xff0c;垂直领域的 A…

C++ //例13.14 将一批数据以二进制形式存放在磁盘文件中。例13.15 将刚才以二进制形式存放在磁盘文件中的数据读入内存并在显示器上显示。

C程序设计 &#xff08;第三版&#xff09; 谭浩强 例13.14 例13.15 例13.14 将一批数据以二进制形式存放在磁盘文件中。 例13.15 将刚才以二进制形式存放在磁盘文件中的数据读入内存并在显示器上显示。 IDE工具&#xff1a;VS2010 Note: 使用不同的IDE工具可能有部分差异。…

Zookeeper之快速入门

前言 本篇文章主要还是让人快速上手入门&#xff0c;想要深入的话可以通过书籍系统的学习。 简介 是什么 可用于协调、构建分布式应用。 本质上是一个分布式的小文件存储系统。提供基于类似于文件系统的目录树方式的数据存储&#xff0c;并且可以对树中的节点进行有效管理…

AI产品经理-借力

AI产品经理-借力&#xff1a;学会善用供应商改造自有产品 1.整个项目的工作方法 2.项目启动-行业调研 3.项目启动-供应商选型