在学习Python那一年里,我遇到的4种编码错误
off999 2024-11-20 20:03 14 浏览 0 评论
一年前,我开始学习Python,那时候的我已经学会其他一些编程语言,例如PHP(把我引入到Web开发中的第一门语言),JavaScript(我已经很擅长使用JavaScript,并且正在编写UI)和当时我主要的收入代码C#。
我通过自己所了解的开发应用程序来学习Python,因此我将许多JavaScript和C#的工作方式整合到了我的代码中,这虽然很糟糕,但有时却很有效。我花了一些时间,阅读别人的代码,并与他人沟通,让自己的语言变得更好。今天,我想和你一起探讨我在学习Python时(代码方面)的一些错误。
1、误解Python范围
python解析范围是基于所谓的LEGB规则,OCAL,Local, Enclosing, Global, Built-in 即使看起来很简单,但当时对我来说还是有些混乱,例如,以下示例:
对于上面的代码,我想要它能正常工作,并更改全局变量x以最终打印出来6。但是,它突然变得很奇怪,不按照我的想法来输出,让我们看一下更改的代码:
到底是怎么回事?在一个代码段中,全局变量X给出了一个UnboundLocalError但是当我们只是尝试打印它时,它就起作用了。原因与范围界定有关。当你对作用域(例如函数作用域)中的变量进行赋值时,该变量将成为该作用域的局部变量,并在外部作用域中隐藏任何类似命名的变量。这是我们做第一个方案时发生的情况x += 1。如果我们打算x像访问函数那样访问全局变量,则foo()可以执行以下操作:
通过使用关键词global,内部范围可以访问在全局范围内声明的变量,这意味着没有在任何函数中定义的变量。同样,我们可以用nonlocal来达到类似的效果:
nonlocalas global允许你从外部范围访问变量,但是,对于nonlocal,你可以绑定到父范围或全局范围内的对象。
2、遍历列表时修改列表
它在新学习的Python开发人员中甚至在一些经验丰富的开发人员中都很常见。虽然有时看起来似乎并不那么明显,但是在某些情况下,我们还是要修改我们当前正在迭代的数组,从而会产生一些了代码错误的行为,或者如果幸运的话,我们会收到一个错误并注意到它。但是,让我举一个例子说明我的意思,假设给定一个数组,需要将该数组缩小为仅包含偶数元素,可以尝试执行以下操作:
在所描述的方案中,迭代时删除列表或数组的元素时,由于尝试访问不存在的项目,我们会收到错误消息。这是一个坏习惯,应该避免,有更好的方法可以在python中实现类似的功能,其中包括列表理解:
也可以使用filter函数来实现相同的功能,虽然它起到了作用,但还是有人认为这不是Pythonic的方法,我有还是些同意的,但是我不想在这里讨论它们。让我们继续吧:
3、闭包中的变量绑定
我向一些python的前辈询问他们对以下代码片段的看法:
对于许多人(包括我自己),第一次遇到此问题时,我们认为结果将是:
但是,实际上代码最终打印了完全不同的结果,我们对为什么感到非常困惑。原来是Python会执行后期绑定行为,根据该行为,在调用内部函数时会查询闭包中使用的变量的值。因此,在我们的示例中,每当调用任何返回的函数时,都会在调用i时在周围的范围中查找的值。解决此问题的方法似乎有些棘手,但实际上却很有效
通过使用lambda函数的默认参数传递值,i可以生成函数以执行所需的行为。我对这种解决方案感到非常困惑,但我仍然认为它不是很优雅,但是有些人喜欢它。如果你知道该问题的另一种解决方案,请您在评论中让我知道,我很乐意阅读有关该问题的信息。
4、名称与Python标准库模块冲突
当我刚开始学习时,这个问题实际上很普遍,甚至现在,有时我也会犯这个错误。出现此问题的原因是使用与Python随带的标准库中的模块相同的名称来命名你的一个模块。(例如,你的代码中可能有一个名为email.py的模块,这与同名的标准库模块发生冲突)。
也许名称本身冲突不会对你的代码产生任何问题,但是有时我们会覆盖Python标准库的功能或模块,该功能或模块稍后在已安装的库中使用,并且会引发错误或行为不当而发生冲突,这是一个糟糕的情况。一个典型的错误如下:
通过简单地创建一个list变量,然后我们中断了对该list函数的访问。并且,即使还有其他访问方式(例如__builtins__.list()),我们也应该避免使用这种名称。
最后
本文并没有涵盖开发人员在使用Python进行编码时所犯的所有常见错误,而是涵盖了我最苦恼的那些事情。如果你想了解更多有关如何编写出色的Python代码并避免其他错误的信息,我建议你订阅我的下一篇文章。
相关推荐
- Python中的两个内置函数id()和type()
-
id()>>>id(3)2531362761072>>>id(3.222222)2531397393680>>>id(3.0)25313...
- python 函数中,如何将另一个函数作为参数传递
-
python函数中,如何将另一个函数作为参数传递,类似C#委托defadd(a,b):"""这是一个简单的加法函数,接受两个参数并返回它们的和。""...
- Python性能暴涨10倍的终极指南:7个核心技巧+代码压缩秘籍
-
提升Python程序运行性能,使代码运行更流畅更快,以及压缩代码,减小代码大小,下面的方法仅供大家参考,有什么更好的方法在评论区说说。1.使用NumPy/SciPy替代纯Python循环...
- Python 匿名函数(Lambda 函数)详解
-
匿名函数(AnonymousFunction),在Python中称为lambda函数,是一种不需要使用def关键字定义的小型函数。它主要用于简化代码,特别适合需要函数对象的地方。1.基...
- Python学习笔记 | 匿名函数lambda、映射函数map和过滤函数filter
-
什么是匿名函数?定义:没有函数名的自定义函数场景:函数体非常简单,使用次数很少,没有必要声明函数,通常搭配高阶函数使用。高阶函数是能够把函数当成参数进行传递的函数,如:映射函数map和过滤函数fil...
- python练习:自定义函数调用:商品购物实例
-
1、商品录入dict_myshanpin_iof={101:{"商品名称":"毛毛熊","单价":25},102:{"商品名称":...
- Python中如何使用Lambda函数(lambda在python中的用法)
-
Python和其他编程语言一样,都在其语法中添加了lambda函数,Pythonlambda是匿名函数,比常规Python自定义函数有更简洁的语法。虽然Lambda语法在开始时可能会觉得有点混乱,...
- 8-Python内置函数(python内置函数代码)
-
Python提供了丰富的内置函数,这些函数可以直接使用而无需导入任何模块。以下是一些常用的内置函数及其示例:1-print()1-1-说明输出指定的信息到控制台。1-2-例子2-len()2-1-说...
- 用Python进行函数式编程(python函数程序)
-
什么是函数式编程?函数式程序设计是一种编程范例,它把计算当作数学函数的评价,避免状态和可变数据。换句话说,函数编程(FunctionalProgramming,FP)促进没有副作用和不变变量的代码。它...
- python 函数进阶(python如何进阶)
-
1.有名函数和匿名函数#该函数有名称,名称是adddefadd(x,y):returnx+y#改函数没有名称属于匿名函数,也叫lambda表达式lambda_add...
- python自学者的分享:自定义函数、参数作用域、匿名函数、装饰器
-
#自定义新函数函数名newhsdefnewhs(a,b=1):#b的默认值为1,在没有传入b值时,采用默认值,,默认值参数不能放前边returna-bprint(newh...
- Python 函数式编程的 8 大核心技巧,不允许你还不会
-
函数式编程是一种强调使用纯函数、避免共享状态和可变数据的编程范式。Python虽然不是纯函数式语言,但提供了丰富的函数式编程特性。以下是Python函数式编程的8个核心技巧:1.纯函数(...
- 零基础到发布:手把手教你创建并分发 Python 自定义库
-
作为程序员,我们经常依赖各种外部库来解决不同的问题。这些库由技术娴熟的开发者创建,为我们提供了节省时间和精力的解决方案。但你是否曾想过:“我也能创建属于自己的自定义库吗?”答案是肯定的!本文将为你详细...
- 打工人学Python:(七)自定义函数,打造自己的武器库
-
从一个简单的函数开始#!/usr/bin/envpython#-*-encoding:utf-8-*-'''@Purpose:Wordcount@...
- 肖sir_python自定义函数format、zip函数
-
python自定义函数一、常见的自定义函数已经学过的函数:list、print、set、str、type、tuple、dict、range、input等今天学的函数:format二、实战讲解(一)f...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python自定义函数 (53)
- python进度条 (54)
- python的for循环 (56)
- python串口编程 (60)
- python写入txt (51)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python字典增加键值对 (53)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python qt (52)
- python人脸识别 (54)
- python多态 (60)
- python命令行参数 (53)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- centos7安装python (53)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)