网站性能检测评分
注:本网站页面html检测工具扫描网站中存在的基本问题,仅供参考。
python中file
学习Python必不可少的几款好用的Python开发工具!你会几个? 企业视频课程
Python 是一门新手友好、功能强大、高效灵活的编程语言,学会之后无论是想进入数据分析、人工智能、网站开发这些领域,还是希望掌握第一门编程语言,都可以用 Python 来开启无限未来的无限可能!工欲善其事必先利其器,一个好的工具能让起到事半功倍的效果,Python社区提供了足够多的优秀工具来帮助开发者更方便的实现某些想法。今天千锋武汉Python培训小编推荐下面这几个Python开发工具,相信一定会给你的工作带来很多便利。
Python Tutor
Python Tutor 是由 Philip Guo 开发的一个免费教育工具,可帮助学生攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。通过这个工具,教师或学生可以直接在 Web 浏览器中编写 Python 代码,并逐步可视化地运行程序。如果你不知道代码在内存中是如何运行的,不妨把它拷贝到Tutor里可视化执行一遍,加深理解。
地址:http://pythontutor/
IPython
IPython 是一个 for Humans 的 Python 交互式 shell,用了它之后你就不想再用自带的 Python shell 了,IPython 支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多实用功能和函数,同时它也是科学计算和交互可视化的最佳平台。
地址:https://ipython.org/
Jupyter Notebook
Jupyter Notebook 就像一个草稿本,能将文本注释、数学方程、代码和可视化内容全部组合到一个易于共享的文档中,以 Web 页面的方式展示。它是数据分析、机器学习的必备工具。
地址:http://jupyter.org/
Anaconda
Python 虽好,可总是会遇到各种包管理和 Python 版本问题,特别是 Windows 平台很多包无法正常安装,为了解决这些问题,Anoconda 出现了,Anoconda 包含了一个包管理工具和一个Python管理环境,同时附带了一大批常用数据科学包,也是数据分析的标配。
地址:https://anaconda/
Skulpt
Skulpt 是一个用 Java 实现的在线 Python 执行环境,它可以让你轻松在浏览器中运行 Python 代码。使用 skulpt 结合 CodeMirror 编辑器即可实现一个基本的在线Python编辑和运行环境。
Win10系统如何搭建Python 3.5.2开发环境
因为工作需求,一位 windows10正式版 用户,想要在最新的系统中搭建Python 3.5.2开发环境。那么,这该如何操作呢?会不会非常复杂呢?为了帮助大家更好地使用win10系统,下面小编就分享搭建和测试Python 3.5.2开发环境的具体方法。
Win10系列软件最新版本下载
Win10系统正式版立即下载360安全卫士Win10版立即下载Win10优化大师立即下载具体方法如下:
1、首先从Python官网下载安装软件,如下图,输入IP地址;
2、找到Download,单击下面Python 3.5.2进入下载页面;
3、点击“windows x86-64 executable installer”进行下载;
各个版本的介绍:
(下面的都是windows系统平台的安装包,x86适合32位操作系统;x86-64适合64位操作系统)
下面是官网的解释:
The binaries for AMD64 will also work on processors that implement
the Intel 64 architecture. (Also known as the "x64" architecture, and
formerly known as both "EM64T" and "x86-64".) They will not work on
Intel Itanium Processors (formerly "IA-64").
Windows users: If installing Python 3.5 as a non-privileged user,
you may need to escalate to administrator privileges to install an
update to your C runtime libraries.
Windows users: There are now "web-based" installers for Windows
platforms; the installer will download the needed software components at
installation time.
Windows Users: There are redistributable zip files containing the
Windows builds, making it easy to redistribute Python as part of another
software package. Please see the documentation regarding Embedded Distribution for more information.It is intended for acting as part of another application, rather than being directly accessed by end-users.
可以通过下面3种途径获取python:
web-based installer 是需要通过联网完成安装的
executable installer 是可执行文件(*.exe)方式安装
embeddable zip file 嵌入式版本,可以集成到其它应用中
4、找到下载后的文件;
5、双击安装文件,点击下图所示的自定义安装“custom installation”;
6、点击下一步,“Next”;
7、此处可更换安装目录,然后单击安装“install”;
8、等待自动安装……
9、安装成功!
运行测试:
1、启动Python shell,在“搜索Web和Windows”中输入:idle;
2、就会启动python IDLE,可以交互运行python;
3、同样可以按“Ctrl + N”打开IDLE开发工具,输入程序代码;
4、编写完程序后,“Ctrl + S”保存,然后如大多数编程软件一样,按“F5”运行程序;
5、如果程序没有问题,此时在Idle中打印出“Hello World!”。
Win10搭建Python 3.5.2开发环境教程就介绍到这里了。刚刚使用windows10正式版的用户们,如果也有同样需求的话,不妨按照上述步骤操作自己手动一遍。
好了,今天的知识就分享到这里,欢迎关注爱编程的南风,私信关键词:学习资料,获取更多学习资源,如果文章对你有有帮助,请收藏关注,在今后与你分享更多学习python的文章。同时欢迎在下面评论区留言如何学习python。
python(十八)中断和异常处理 营销视频课程
一、break
二、continue
三、异常处理
循环我们已经用的很多了,括while和for...in。while循环在条件不满足时结束,for循环遍历完序列后结束。如果在循环条件仍然满足或序列没有遍历完的时候,想要强行跳出循环,就需要用到break语句。
while True:
a = raw_input()
if a == 'end':
break
上面的程序不停接受用户输入。当用户输入一行“end”时,程序结束。
for i in range(10):
a = raw_input()
if a == 'exit':
break
上面的程序接受用户10次输入,当用户输入一行“exit”时,程序提前结束。
break是彻底地跳出循环,而continue只是略过本次循环的余下内容,直接进入下一次循环。
在我们前面写的那个统计分数的程序里,如果发现有成绩不足60分,就不记入总成绩。当然,你可以用if判断来实现这个效果。但我们今天要说另一种方法:continue。
for score in data[1:]:
point = int(score)
if point
continue
sum += point
注意:无论是continue还是break,其改变的仅仅是当前所处的最内层循环的运行,如果外层还有循环,并不会因此略过或跳出。
在程序运行时,如果我们的代码引发了错误,python就会中断程序,并且输出错误提示。
比如我们写了一句:
print int('0.5')
运行后程序得到错误提示:
Traceback (most recent call last):
File "C:/Python27/test.py", line 1, in
print int('0.5')
ValueError: invalid literal for int() with base 10: '0.5'
意思是,在test.py这个文件,第1行,print int('0.5')这里,你拿了一个不是10进制能够表示的字符,我没法把它转成int值。
上面的错误可以避免,但在实际的应用中,有很多错误是开发者无法控制的,例如用户输入了一个不合规定的值,或者需要打开的文件不存在。这些情况被称作“异常”,一个好的程序需要能处理可能发生的异常,避免程序因此而中断。
例如我们去打开一个文件:
f = file('non-exist.txt')
print 'File opened!'
f.close()
假如这个文件因为某种原因并没有出现在应该出现的文件夹里,程序就会报错:
IOError: [Errno 2] No such file or directory: 'non-exist.txt'
程序在出错处中断,后面的print不会被执行。
在python中,可以使用try...except语句来处理异常。做法是,把可能引发异常的语句放在try-块中,把处理异常的语句放在except-块中。
把刚才那段代码放入try...except中:
try:
f = file('non-exist.txt')
print 'File opened!'
f.close()
except:
print 'File not exists.'
print 'Done'
当程序在try内部打开文件引发异常时,会跳过try中剩下的代码,直接跳转到except中的语句处理异常。于是输出了“File not exists.”。如果文件被顺利打开,则会输出“File opened!”,而不会去执行except中的语句。
但无论如何,整个程序不会中断,最后的“Done”都会被输出。
在try...except语句中,try中引发的异常就像是扔出了一只飞盘,而except就是一只灵敏的狗,总能准确地接住飞盘。
sciencen. 科学
writtenadj. 书面的, 写成文字的 vbl. 写, 著述
windown. 窗户
behaviorn. 行为,举止
definitionn. 定义, 阐释,清晰度
以上每天用一点时间,练习并写出练习过程这样是对于学习的一个及时反馈重在坚持!
Python智阐8-文件和目录操作 行业视频课程
本篇主要介绍文件目录、文件的一些操作方法。
其中目录的操作需要引入os模块:
import os
操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中。
1、目录操作方法
1.1 查看当前目录
import osprint(os.getcwd()) #查看当前目录
输出:
>>>D:\Code
1.2 返回指定目录下的所有文件
import ospath = r"D:\Code"print(os.listdir(path))
会以列表的形式,返回所有文件
输出:
>>>['.idea', '4.py', 'log', 'test.txt', 'venv', '函数.py', '基本数据类型.py','文件读写.py', '输入和输出.py']
1.3 目录创建、重命名、删除
import ospath = r"D:\Code"# 在当前目录D:\Code下创建目录os.mkdir("test") #方式1:直接创建testos.mkdir(r"D:\Code\test") #方式2:输入完整目录进行创建# 重命名刚刚创建的目录os.rename("test", "testpy")# 删掉刚刚创建的目录os.rmdir("testpy") #方式1:直接删除testos.rmdir(r"D:\Code\testpy") #方式2:输入完整目录进行删除
1.4 判断目录是否存在
import ospath = r"D:\Code"#判断是否是目录print(os.path.isdir(path))#判断目录是否存在print(os.path.exists(path))
1.5 目录拼接、拆分
import os#目录拼接newPath = os.path.join(r"D:\Code\test", 'test.txt')print(newPath)
#目录拆分path = os.path.split(r"D:\Code\test\test.txt")print(path)
#获取文件扩展名txtName = (os.path.splitext(r"D:\Code\test\test.txt"))print(txtName)print(txtName[1])
输出:
>>>
>>>D:\Code\test\test.txt
>>>('D:\\Code\\test', 'test.txt')
>>>('D:\\Code\\test\\test', '.txt')
>>>.txt
2、打开文件/关闭文件
文件的打开和关闭用open()和close()来实现
open()函数主要参数介绍:
参数file:文件路径
参数mode:打开方式,常用的mode有
r 以只读的方式打开文件,文件读取光标会放到文件的开头
w 打开一个文件,只用于写入,如果文件存在则打开文件,写入的内容会覆盖原内容,如果文件不存在,则新生成一个文件。
a 打开一个文件用于追加。如果文件存在,则文件读写光标会放到文件的末尾,新写入的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
+ 打开一个文件进行更新(可读可写)。
b 二进制模式。
还有r+、w+、a+、rb、wb、ab等。可自行参考官方文档。
参数encoding:编码方式 (encoding="utf-8"一般都是utf-8)
errors:错误处理 (errors="ignore"表示忽略错误)
path = r"D:\Code\test.txt"f = open(path, "r")#f = open(path, "r", encoding="utf-8", errors="ignore")f.close()
3、读写文件
3.1 read() 读取文件内容
path = r"D:\Code\test.txt"f = open(path, "r")txt = f.read() #读取文件全部内容print(txt)f.close()
3.2 read(n) 读取指定字符数
path = r"D:\Code\test.txt"f = open(path, "r")txt = f.read(2) #读取指定字符 -1 表示读取全部内容print(txt)f.close()
3.3 readline() 读取整行
path = r"D:\Code\test.txt"f = open(path, "r")txt = f.readline() #读取整行print(txt)f.close()
3.4 readlines() 读取所有行并返回列表
path = r"D:\Code\test.txt"f = open(path, "r")txt = f.readlines() #读取所有行并返回列表print(txt)f.close()
输出:
>>>['hello 智数分析1!\n', 'hello 智数分析2!\n', 'hello 智数分析3!\n', 'hello 智数分析4!']
3.5 写文件
内容先写入内存缓冲区,然后再由内存缓冲区写入到文件。
path = r"D:\Code\test.txt"f = open(path, "a")f.write("hello python") #将信息写入内存缓冲区f.flush() #刷新内存缓冲区f.close()
4、文件读写异常
前面已经介绍过了python异常处理,我们在处理文件时也经常会遇到一些异常,会导致f.close()无法执行。
如果也用try......except......finally方式去处理,程序代码会比较复杂。
try:f = openr(r"D:\Code\test.txt", 'r') print(f.read())finally: if f: f.close()
Python提供了with语句来帮我们自动调用close()方法,以后我们要处理文件时,都可以用以下这种写法。
path = r"D:\Code\test.txt"with open(path, "r") as f:print(f.read())
Python代码风格:PEP8规则 笔记 公司视频课程
Python程序设计的代码风格应该遵循PEP8规则:
一、代码布局
1、缩进:
每级缩进4个空格(不用Tab,更不空格Tab混用)
1、续行应该与其包裹元素对齐,要么使用圆括号、方括号和花括号内的隐式行连接来垂直对齐,要么使用悬挂式缩进对齐。当使用悬挂缩进时,应该考虑到第一行不应该有参数,以及使用缩进以区分自己是续行。
2、缩进4个空格的规则对于续行是可选的。
3、当 if 语句的条件部分长到需要换行写的时候,注意可以在两个字符关键字的连接处(比如 if ),增加一个空格,再增加一个左括号来创造一个4空格缩进的多行条件。这会与 if 语句内同样使用4空格缩进的代码产生视觉冲突。PEP没有明确指明要如何区分i发的条件代码和内嵌代码。可使用的选项包括但不限于下面几种情况:
4、(可以参考下面关于是否在二进制运算符之前或之后截断的讨论)
在多行结构中的大括号/中括号/小括号的右括号可以与内容对齐单独起一行作为最后一行的第一个字符,如:
或者也可以与多行结构的第一行第一个字符对齐,如:
2、Tab还是空格?
空格是被首先推荐的缩进方式。
Tab应该只在现有代码已经使用tab进行缩进的情况下使用,以便和现有代码保持一致。
Python 3不允许再同一个代码块中Tab和空格混合使用。
混合使用制表符和空格缩进的Python2代码应该统一转成空格。
使用命令行运行Python 2时,使用-t选项,会出现非法混用tab和空格的警告。当使用-tt选项时,这些警告会变成错误。强烈推荐使用这些选项!
3、最大行长
每行最大长度79个字符。
对于连续大段的文字(比如文档字符串(docstring)或注释),每行应该被限制在72个字符长度内。
Python标准库比较传统,将行长限制在79个字符以内(文档字符串/注释为72个字符)。
一种推荐的换行方式是利用Python圆括号、方括号和花括号中的隐式续行。长行可以通过在括号内换行来分成多行。应该最好加上反斜杠来区别续行。
有时续行只能使用反斜杠才。例如,较长的多个 with 语句不能采用隐式续行,只能接受反斜杠表示换行:
另一个这样的例子是assert语句。要确保续行的缩进适当。
在二元运算符之前应该换行吗?
遵循数学的传统能产出更多可读性高的代码:
4、空行
顶层函数和类的定义,前后用两个空行隔开。
类里的方法定义用一个空行隔开。
相关的功能组可以用额外的空行(尽量少地)隔开。一堆相关的单行代码之间的空白行可以省略(例如,一组虚拟实现 dummy implementations)。
在函数中使用空行来区分逻辑段(尽量少地)。
Python接受control-L(即^L)换页符作为空格;许多工具把这些字符当作页面分隔符,所以你可以在文件中使用它们来分隔相关段落。请注意,一些编辑器和基于Web的代码阅读器可能无法识别control-L为换页,将在其位置显示另一个字形。
5、源文件编码
Python核心发布版本中的代码总是以UTF-8格式编码(或者在Python2中用ASCII编码)。
使用ASCII(Python 2)或者UTF-8(Python 3)的文件不应该添加编码声明。
在标准库中,只有用作测试目的,或者注释或文档字符串需要提及作者名字而不得不使用非ASCII字符时,才能使用非默认的编码。否则,在字符串文字中包括非ASCII数据时,推荐使用\x, \u, U或N等转义符。
对于Python 3.0及其以后的版本中,标准库遵循以下原则(参见PEP 3131):Python标准库中的所有标识符都必须只采用ASCII编码的标识符,在可行的条件下也应当使用英文词(很多情况下,使用的缩写和技术术语词都不是英文)。此外,字符串文字和注释应该只包括ASCII编码。只有两种例外:
(a) 测试情况下为了测试非ASCII编码的特性
(b) 作者名字。作者名字不是由拉丁字母组成的也必须提供一个拉丁音译名。
鼓励面向全球的开源项目都采用类似的原则。
6、导入
1、imports应该分行写,而不是都写在一行,例如:
这样写也是可以的:
导入(import)始终在文件的顶部,在模块注释和文档字符串之后,在模块全局变量和常量之前。
导入顺序如下:
imports应该按照下面的顺序分组来写:
1、标准库imports
2、相关第三方imports
3、本地应用/库的特定imports
不同组的imports之前用空格隔开。
将任何相关的 __all__ 说明(specification)放在imports之后。
推荐使用绝对(absolute)imports,因为这样通常更易读,在import系统没有正确配置的情况下,也会有更好的表现(或者至少会给出错误信息):
在绝对路径比较长的情况下,也可以使用相对导入:
Python 3中已经禁止隐式的相对导入。
导入类的方法,通常可以这样写:
如果和本地命名的拼写产生了冲突,应当使用绝对导入:
禁止使用通配符导入。
通配符导入(from import *)应该避免,因为它不清楚命名空间有哪些名称存,混淆读者和许多自动化的工具。唯一的例外是重新发布对外的API时可以考虑使用。
7、模块中前后具有双下划线的变量名
像__all__ , __author__ , __version__ 等这样的模块中的变量名(也就是名字里有两个前缀下划线和两个后缀下划线),应该放在文档字符串的后面,以及除from __future__ 之外的import表达式前面。Python要求将来在模块中的导入,必须出现在除文档字符串之外的其他代码之前。
比如:
二、字符串引号
Python中单引号字符串和双引号字符串都是相同的。注意尽量避免在字符串中的反斜杠以提高可读性。
根据PEP 257, 三个引号都使用双引号。
三、表达式和语句中的空格
在下列情况下,避免使用无关的空格:
1、紧跟在小括号,中括号或者大括号后。
2、紧贴在逗号、分号或者冒号之前。
3、然而,冒号在切片中就像二元运算符,在两边应该有相同数量的空格(把它当做优先级最低的操作符)。在扩展的切片操作中,所有的冒号必须有相同的间距。例外情况:当一个切片参数被省略时,空格就被省略了。
4、紧贴在函数参数的左括号之前。
5、紧贴索引或者切片的左括号之前。
6、为了和另一个赋值语句对齐,在赋值运算符附件加多个空格。
其他建议
1、避免在尾部添加空格。因为尾部的空格通常都看不见,会产生混乱:比如,一个反斜杠后面跟一个空格的换行符,不算续行标记。有些编辑器不会保留尾空格,并且很多项目(像CPython)在pre-commit的挂钩调用中会过滤掉尾空格。
总是在二元运算符两边加一个空格:赋值(=),增量赋值(+=,-=),比较(==,,!=,,=,in,not,in,is,is not),布尔(and, or, not)。
如果使用具有不同优先级的运算符,请考虑在具有最低优先级的运算符周围添加空格。有时需要通过自己来判断;但是,不要使用一个以上的空格,并且在二元运算符的两边使用相同数量的空格。
2、在指定函数 关键字参数 或者 默认参数 值的时候,不要在=附近加上空格。
3、功能型注释应该使用冒号的一般性规则,并且在使用 ->的时候要在两边加空格。(参考下面的功能注释得到能够多信息)
4、当给有类型备注的参数赋值的时候,在=两边添加空格(仅针对那种有类型备注和默认值的参数)。
5、复合语句(同一行中的多个语句)通常是不允许的。
6、虽然有时候将小的代码块和 if/for/while 放在同一行没什么问题,多行语句块的情况不要这样用,同样也要避免代码行太长!
四、注释
与代码自相矛盾的注释比没注释更差。修改代码时要优先更新注释!
注释是完整的句子。如果注释是断句,首字母应该大写,除非它是小写字母开头的标识符(永远不要修改标识符的大小写)。
如果注释很短,可以省略末尾的句号。注释块通常由一个或多个段落组成。段落由完整的句子构成且每个句子应该以点号(后面要有两个空格)结束,并注意断词和空格。
非英语国家的程序员请用英语书写你的注释,除非你120%确信代码永远不会被不懂你的语言的人阅读。
1、注释块
注释块通常应用在代码前,并和这些代码有同样的缩进。每行以 '# '(除非它是注释内的缩进文本,注意#后面有空格)。
注释块内的段落用仅包含单个 '#' 的行分割。
2、行内注释
慎用行内注释(Inline Comments) 节俭使用行内注释。 行内注释是和语句在同一行,至少用两个空格和语句分开。行内注释不是必需的,重复罗嗦会使人分心。
不推荐:
但是有时,很有必要:
加了以后对理解代码很有帮助的情况下,关键处才加。
3、文档字符串
文档字符串的标准参见:PEP 257。
为所有公共模块、函数、类和方法书写文档字符串。非公开方法不一定有文档字符串,建议有注释(出现在 def 行之后)来描述这个方法做什么。
更多参考:PEP 257 文档字符串约定。注意结尾的 """ 应该单独成行,例如:
单行的文档字符串,结尾的 """ 在同一行。
4、版本标签
如果你必须在源文件中包含git、Subversion、CVS或RCS crud信息,放置在模块的文档字符串之后,任何其他代码之前,上下各用一个空行:
五、命名规范
Python库的命名约定有点混乱,不可能完全一致。但依然有些普遍推荐的命名规范的。新的模块和包 (包括第三方的框架) 应该遵循这些标准。对不同风格的已有的库,建议保持内部的一致性。
1、最重要的原则
用户可见的API命名应遵循使用约定而不是实现。
2、命名风格
以下是常见的命名方式:
b(单个小写字母)
B(单个大写字母)
lowercase (小写字母)
lower_case_with_underscores (使用下划线分隔的小写字母)
UPPERCASE( 大写字母)
UPPER_CASE_WITH_UNDERSCORES (使用下划线分隔的大写字母)
CapitalizedWords(首字母大写的单词串或驼峰缩写)
注意: 使用大写缩写时,缩写使用大写字母更好。故 HTTPServerError 比 HttpServerError 更好。
mixedCase(不同于首字母大写,第一个单词的首字母小写)
Capitalized_Words_With_Underscores(带下划线,首字母大写,巨丑无比)
还有一种风格使用短前缀分组名字。这在Python中不常用, 但出于完整性提一下。例如,os.stat()返回的元组有st_mode, st_size, st_mtime等等这样的名字(与POSIX系统调用结构体一致)。
X11库的所有公开函数以X开头, Python中通常认为是不必要的,因为属性和方法名有对象作前缀,而函数名有模块名为前缀。
下面讲述首尾有下划线的情况:
_single_leading_underscore:(单前置下划线): 弱内部使用标志。 例如"from M import " 不会导入以下划线开头的对象。
single_trailing_underscore_(单后置下划线): 用于避免与 Python关键词的冲突。 例如:
__double_leading_underscore(双前置下划线): 当用于命名类属性,会触发名字重整。 (在类FooBar中,__boo变成 _FooBar__boo)。
__double_leading_and_trailing_underscore__(双前后下划线):用户名字空间的魔法对象或属性。例如:__init__ , __import__ or __file__,不要自己发明这样的名字。
3、命名约定规范
避免采用的名字:
决不要用字符'l'(小写字母el),'O'(大写字母oh),或 'I'(大写字母eye) 作为单个字符的变量名。一些字体中,这些字符不能与数字1和0区别。用'L' 代替'l'时。
包和模块名:
模块名要简短,全部用小写字母,可使用下划线以提高可读性。包名和模块名类似,但不推荐使用下划线。
模块名对应到文件名,有些文件系统不区分大小写且截短长名字,在 Unix上不是问题,但当把代码迁移到 Mac、Windows 或 DOS 上时,就可能是个问题。当然随着系统的演进,这个问题已经不是经常出现。
另外有些模块底层用C或C++ 书写,并有对应的高层Python模块,C/C++模块名有一个前置下划线 (如:_socket)。
类名:
遵循CapWord。
接口需要文档化并且可以调用时,可能使用函数的命名规则。
注意大部分内置的名字是单个单词(或两个),CapWord只适用于异常名称和内置的常量。
异常名:
如果确实是错误,需要在类名添加后缀 "Error"。
全局变量名:
变量尽量只用于模块内部,约定类似函数。
对设计为通过 "from M import " 来使用的模块,应采用 __all__ 机制来防止导入全局变量;或者为全局变量加一个前置下划线。
函数名:
函数名应该为小写,必要时可用下划线分隔单词以增加可读性。 mixedCase(混合大小写)仅被允许用于兼容性考虑(如: threading.py)。
函数和方法的参数:
实例方法第一个参数是 'self'。
类方法第一个参数是 'cls'。
如果函数的参数名与保留关键字冲突,通常在参数名后加一个下划线。
方法名和实例变量:
同函数命名规则。
非公开方法和实例变量增加一个前置下划线。
为避免与子类命名冲突,采用两个前置下划线来触发重整。类Foo属性名为__a, 不能以 Foo.__a访问。(执著的用户还是可以通过Foo._Foo__a。) 通常双前置下划线仅被用来避免与基类的属性发生命名冲突。
常量:
<...Python程序员最常犯的10个错误,你中招了吗? 推广视频课程
大数据文摘作品
编译:什锦甜、Gao Ning、小鱼
Python简介
Python是一种具有动态语义的、面向对象的解释型高级编程语言。因其内置了高级数据结构,并支持动态类型和动态绑定,使用Python进行快速应用程序开发十分便利。同时作为一门脚本语言,它兼容部分现有的组件和服务。Python还支持模块和各种库的扩展,有助于实现模块化编程和提高代码复用率。
关于本文
刚接触这门语言的新手可能会对Python简洁灵活的语法有些不适应,或是低估了Python强大的性能。鉴于此,本文列出了Python开发人员常犯的10个小错误,资深程序猿也难免会中招哦。
本文供Python高级开发人员参考,Python小白可以参考下面这篇文章:
http://onlamp/pub/a/python/2004/02/05/learn_python.html
常见错误1:滥用表达式作为函数参数的默认值
Python允许开发者指定函数参数的默认值,这也是Python的一大特色,但当默认值可变时,可能会给开发者带来一些困扰。例如下面定义的函数:
>>> def foo(bar=[]): # bar is optional and defaults to [] if not specified... bar.append("baz") # but this line could be problematic, as we'll see...... return bar
看出bug了吗?那就是在每次调用函数前没有对可变参数进行赋值,而认为该参数就是默认值。比如上面的代码,有人可能期望在反复调用foo()时返回'baz',以为每次调用foo()时,bar的值都为[],即一个空列表。
但是,让我们来看看代码运行结果:
>>> foo()["baz"]>>> foo()["baz", "baz"]>>> foo()["baz", "baz", "baz"]
嗯?为什么每次调用foo()后会不断把"baz"添加到已有的列表,而不是新建一个新列表呢?答案就是,函数参数的默认值仅在定义函数时执行一次。因此,仅在第一次定义foo()时,bar初始化为默认值(即空列表),此后,每次调用foo()函数时,参数bar都是第一次初始化时生成的列表。
常见的解决方案:
>>> def foo(bar=None):... if bar is None: # or if not bar:... bar = []... bar.append("baz")... return bar...>>> foo()["baz"]>>> foo()["baz"]>>>foo()["baz"]
常见错误2:错误地使用类变量
代码示例:
>>> class A(object):... x = 1...>>> class B(A):... pass...>>> class C(A):... pass...>>> print A.x, B.x, C.x1 1 1
运行结果没问题。
>>> B.x = 2>>> print A.x, B.x, C.x1 2 1
结果也正确。
>>> A.x = 3>>> print A.x, B.x, C.x3 2 3
什么鬼?我们只改变了A.x.,为什么C.x 也变了?
在Python中,类变量是以字典形式进行内部处理,遵循方法解析顺序(Method Resolution Order ,MRO)。因此,在上述代码中,因为在类C中没有找到属性x,它就会从父类中查找x的值(尽管Python支持多重继承,但上述代码只存在一个父类A)。换句话说,C没有独立于类A的属于自己的x。因此,C.x实际上指的是A.x。除非处理得当,否则就会导致Python出现错误。
如果想更深入了解Python的类特性,请戳:
https://toptal/python/python-class-attributes-an-overly-thorough-guide
常见错误3:错误指定异常代码块的参数
假设你有如下代码:
>>> try:... l = ["a", "b"]... int(l[2])... except ValueError, IndexError: # To catch both exceptions, right?... pass...Traceback (most recent call last):File "
这里的问题是except语句不接受以这种方式指定的异常列表。在Python2.x中,except Exception语句中变量e可用来把异常信息绑定到第二个可选参数上,以便进一步查看异常的情况。因此,在上述代码中,except语句并没有捕捉到IndexError异常;而是将出现的异常绑定到了参数IndexError中。
想在一个except语句同时捕捉到多个异常的正确方式是,将第一个参数指定为元组,并将要捕捉的异常类型都写入该元组中。为了方便起见,可以使用as关键字,Python 2 和Python 3都支持这种语法格式:
>>> try:... l = ["a", "b"]... int(l[2])... except (ValueError, IndexError) as e: ... pass...>>>
常见错误4:错误理解Python中变量的作用域
Python变量作用域遵循LEGB规则,LEGB是Local,Enclosing,Global,Builtin的缩写,分别代表本地作用域、封闭作用域、全局作用域和内置作用域,这个规则看起来一目了然。事实上,Python的这种工作方式较为独特,会导致一些编程错误,例如:
>>> x = 10>>> def foo():... x += 1... print x...>>> foo()Traceback (most recent call last):File "
问题出在哪?
上面的错误是因为在作用域内对变量赋值时,Python自动将该变量视为该作用域的本地变量,并对外部定义的同名变量进行了屏蔽。因此,原本正确的代码,在某个函数内部添加了一个赋值语句后,却意外收到了UnboundLocalError的报错信息。
关于UnboundLocalError更多内容请戳:
https://docs.python.org/2/faq/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value
在使用列表时,Python程序员更容易掉入此类陷阱,例如:
>>> lst = [1, 2, 3]>>> def foo1():... lst.append(5) # This works ok......>>> foo1()>>> lst[1, 2, 3, 5]>>> lst = [1, 2, 3]>>> def foo2():... lst += [5] # ... but this bombs!...>>> foo2()Traceback (most recent call last):File "
奇怪,为什么foo1正常运行,而foo2崩溃了呢?
原因和上一个案例中出现的问题相似,但这里的错误更加细微。函数foo1没有对变量lst进行赋值操作,而函数foo2有赋值操作。
首先, lst += [5]是lst = lst + [5]的缩写形式,在函数foo2中试图对变量lst进行赋值操作(Python将变量lst默认为本地作用域的变量)。但是,lst += [5]语句是对lst变量自身进行的赋值操作(此时变量lst的作用域是函数foo2),但是在函数foo2中还未声明该变量,所以就报错啦!
常见错误5:在遍历列表时修改列表
下面代码中的错误很明显:
>>> odd = lambda x : bool(x % 2)>>> numbers = [n for n in range(10)]>>> for i in range(len(numbers)):... if odd(numbers[i]):... del numbers[i] # BAD: Deleting item from a list while iterating over it...Traceback (most recent call last):File "
有经验的程序员都知道,在Python中遍历列表或数组时不应该删除该列表(数组)中的元素。虽然上面代码的错误很明显,但是在编写复杂代码时,资深程序员也难免会犯此类错误。
幸好Python集成了大量经典的编程范式,如果运用得当,可以大大简化代码并提高编程效率。简单的代码会降低出现上述bug的几率。列表解析式(list comprehensions)就是利器之一,它将完美避开上述bug,解决方案如下:
>>> odd = lambda x : bool(x % 2)>>> numbers = [n for n in range(10)]>>> numbers[:] = [n for n in numbers if not odd(n)] # ahh, the beauty of it all>>> numbers[0, 2, 4, 6, 8]
更多有关列表解析式的详细内容,请戳:https://docs.python.org/2/tutorial/datastructures.html#tut-listcomps
常见错误6:不理解Python闭包中的变量绑定
代码示例:
>>> def create_multipliers():... return [lambda x : i * x for i in range(5)]>>> for multiplier in create_multipliers():... print multiplier(2)...
你以为运行结果会是:
02468
但实际输出结果是:8
8888
惊不惊喜!
这种情况是由于Python延迟绑定(late binding)机制造成的,也就是说只有在内部函数被调用时才会搜索闭包中变量的值。所以在上述代码中,每次调用create_multipliers()函数中的return函数时,会在附近作用域中查询变量i的值。(此时,return中循环已结束,所以i值为4)。
常见解决方案:
>>> def create_multipliers():... return [lambda x, i=i : i * x for i in range(5)]...>>> for multiplier in create_multipliers():... print multiplier(2)...02468
没错!我们利用了匿名函数lambda的默认参数来生成结果序列。有人觉得这种用法很简洁,有人会说它很巧妙,还有人会觉得晦涩难懂。如果你是Python开发人员,那么深刻理解上述语法对你而言非常重要。
常见错误7:模块之间出现循环依赖
假设你有两个文件,分别是a.py和b.py,两者相互导入,如下所示:
a.py模块中的代码:
import bdef f():return b.xprint f()
b.py模块中的代码:
import ax = 1def g():print a.f()
首先,我们尝试导入a.py:
>>> import a1
运行结果正确!这似乎有点出人意料,因为我们在这里进行循环导入,应该会报错呀!
答案是,在Python中如果仅存在一个循环导入,程序不会报错。如果一个模块已经被导入,Python会自动识别而不会再次导入。但是如果每个模块试图访问其他模块不同位置的函数或变量时,那么Error又双叒叕出现了。
回到上面的示例中,当导入a.py模块时,程序可以正常导入b.py模块,因为此时b.py模块未访问a.py中定义任何的变量或函数。b.py模块仅引用了a.py模中的a.f()函数。调用的a.f()函数隶属于g()函数,而a.py或b.py模块中并没有调用g()函数。所以程序没有报错。
但是,如果我们在未导入a.py模块之前先导入b.py模块,结果会怎样?
>>> import bTraceback (most recent call last):File "
报错了!问题在于,在导入b.py的过程中,它试图导入a.py模块,而a.py模块会调用f()函数,f()函数又试图访问b.x变量。但此时,还未对变量b.x进行定义,所以出现了AttributeError异常。
稍微修改下b.py,即在g()函数内部导入a.py就可以解决上述问题。
修改后的b.py:
x = 1def g():
import a # This will be evaluated only when g() is calledprint a.f()
现在我们再导入b.py模块,就不会报错啦!
>>> import b>>> b.g()1 # Printed a first time since module 'a' calls 'print f()' at the end1 # Printed a second time, this one is our call to 'g'
常见错误8:文件命名与Python标准库模块的名称冲突
Python的优势之一就是其集成了丰富的标准库。正因为如此,稍不留神就会在为自己的文件命名时与Python自带标准库模块重名。例如,如果你的代码中有一个名为email.py的模块,恰好就和Python标准库中email.py模块重名了。)
上述问题比较复杂。举个例子,在导入模块A的时候,假如该模块A试图导入Python标准库中的模块B,但你已经定义了一个同名模块B,模块A会错误导入你自定义的模块B,而不是Python标准库中的模块B。这种错误很糟糕,因为程序员很难察觉到是因为命名冲突而导致的。
因此,Python程序员要注意避免与Python标准库模块的命名冲突。毕竟,修改自己模块的名称比修改标准库的名称要容易的多!当然你也可以写一份Python改善建议书(Python Enhancement Proposal,PEP)提议修改标准库的名称。
常见错误9:不熟悉Python2和Python3之间的差异
先来看看foo.py文件中的代码:
import sysdef bar(i):if i == 1: raise KeyError(1) if i == 2: raise ValueError(2)def bad(): e = None try: bar(int(sys.argv[1])) except KeyError as e: print('key error') except ValueError as e: print('value error') print(e)bad()
在Python 2中,上述代码运行正常
$ python foo.py 1key error1$ python foo.py 2value error2
但是在Python 3中运行时:
$ python3 foo.py 1key errorTraceback (most recent call last):File "foo.py", line 19, in
什么情况?原来,在Python 3中,在except代码块作用域外无法访问异常对象。(原因是,Python 3会将内存堆栈中的循环引用进行保留,直到垃圾回收...
python入门——Python中I/O函数 企业视频课程
python大数据课堂已经开始了。想转行大数据,数据挖掘,机器学习,人工智能的小伙伴可以关注啦。上一篇带大家了解了python模块。今天我们来继续了解python中的I/O函数。调试环境以python3.6环境为例。需要代码和demo的朋友可以搜索“栾鹏全栈”到我的CSDN博客。
第八部分. Python中I/O函数
8、Python中I/O函数
8.1、读取键盘输入
str = input("请输入:");
print("你输入的内容是: ", str)
inpu()函数可以接受Python表达式的输入,并输出表达式的计算结果
请输入:[x*5 for x in range(2,10,2)]
输出为:[10, 20, 30, 40]
8.2、打开、关闭读写文件
可以用file对象对大多数文件进行操作。
1)打开文件
你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。
file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
当文件不存在但通过open函数打开时,如果是写入则会自动创建文件,如果是读取内容则会报错。
2)打开文件的模式
3)File对象的属性
4)关闭文件
当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件(Python会自动地关闭之前的文件对象,这样不那么耗费内存)。用close()方法关闭文件是一个很好的习惯。
5)读写文件
无论读、写、还是关闭文件,都需要先用open打开文件。
6)文件内定位
tell()方法告诉你文件内的当前位置(那应该就是告诉你文件指针在哪个位置);换句话说,下一次的读写会发生在文件开头这么多字节之后。
seek(offset [,from])方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。
8.3、文件File对象的方法
8.4、文件OS(文件和目录处理)
下节预告:Python中的异常处理