作为非科班的python小白,有时候对于一些python的基本知识和原理还一知半解,对于之前不清楚的地方摘录在此,供后续查看。Be Pythonic!
1、effective python
1、写代码前确定python版本
python --version
一般python2用2.7.5版本,centos7自带的就是2.7.5版本。现在开发一般用python3,两者区别比较大,建议先确认版本。
2、遵循PEP8风格
使用4个空格缩进而不是tab;
文件中的函数与类用两个空行分开;
同一个类各方法之间用一个空行隔开;
下表获取元素、函数调用或关键字参数不要在两旁添加空格;
变量赋值的时候两边添加空格;
函数、变量和属性用小写字母,中间用下划线连接;
受保护的属性以单下划线开头;
私有的实例属性以两个下划线开头;
以每个首字母大写的方式来命名类;
模块级别的常量以大写字母来拼写;
类中的实例方法,首个参数应命名为self,代表该对象自身;类方法,首个参数命名为cls,表示该类自身;
检测空值用if not xxx,不要用 if len(xxx) == 0;
import总是放在文件开头,引入模块使用绝对名称;
可以使用Pylint来检查格式错误和其他错误
3、bytes、str和Unicode
python3中,bytes是原始8位值,str包含Unicode字符。
编码和解码交给外围来做,核心部分用Unicode字符。
def to_str(bytes_or_str):
if isinstance(bytes_or_str,bytes):
value = bytes_or_str.decode('utf-8')
在python以Unicode作为编码的基础类型,字符串类型编码得到bytes类型对象,以他编码的方式解码得到str(utf-8);
##法
+ Python 中的字符串有两种索引方式,从左往右以 0 开始,从右往左以 -1 开始
+ Python 没有单独的字符类型,一个字符就是长度为 1 的字符串
+ 函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始
+ Python可以在同一行中使用多条语句,语句之间使用分号(;)分割
+ print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=""
+ Python3 中有六个标准的数据类型:
不可变数据(四个):Number(数字)、String(字符串)、Tuple(元组)、Sets(集合);
可变数据(两个):List(列表)、Dictionary(字典)
+ type和instance查看数据类型,type()不会认为子类是一种父类类型。isinstance()会认为子类是一种父类类型。type 是用于求一个未知数据类型对象,而 isinstance 是用于判断一个对象是否是已知类型。
+ 加号 (+) 是字符串的连接符, 星号 (*) 表示复制当前字符串,紧跟的数字为复制的次数。
+ 列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)。
+ 数据类型的转换,你只需要将数据类型作为函数名即可。
+ 一般来说,函数的返回值一般为一个。而函数返回多个值的时候,是以元组的方式返回的。
+ 注释是#、3单引号和3双引号
+ 除了和C语言的运算符之外,还拥有成员运算符(not) in,身份运算符is(not)
+ python 中的 and 从左到右计算表达式,若所有值均为真,则返回最后一个值,若存在假,返回第一个假值;or 也是从左到有计算表达式,返回第一个为真的值;
+ is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。
is not与!=区别于上述一致,一个比较的是引用对象,另一个比较的是两者的值。
+ python 没有自增运算符
+ python中,变量是以内容为基准而不是像 c 中以变量名为基准,所以只要你的数字内容是5,不管你起什么名字,这个变量的 ID 是相同的,同时也就说明了 python 中一个变量可以以多个名称访问。
+ 元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用。因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。在定义的时候,tuple的元素就必须被确定下来。tuple的元素所保存的内容(数值或内存地址)是不允许修改的,但地址映射的对象自身是可以修改的。
+ 不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住。键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行。字典是支持无限极嵌套的。
+ print() sep 参数使用
+ while-else
+ 使用内置 enumerate 函数进行遍历
+ 迭代是Python最强大的功能之一,是访问集合元素的一种方式。迭代器只能往前不会后退。迭代器有两个基本的方法:iter() 和 next()。
+ 在Python中,使用了yield的函数被称为生成器(generator)。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。调用一个生成器函数,返回的是一个迭代器对象。
+ 调用函数时可使用的正式参数类型:必需参数、关键字参数、默认参数和不定长参数,默认参数必须放在最后面
+ 匿名函数:python使用lambda来创建匿名函数,lambda [arg1 [,arg2,.....argn]]:expression
+ Python的作用域一共有4种:L(Local)局部作用域、E(Enclosing)闭包函数外的函数中、G (Global)全局作用域和B(Built-in)内建作用域。只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域。函数内可以访问全局变量,但不能更新(修改)其值,可以加上 global 引用以更新变量值。
+ 每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。列表推导式的执行顺序:各语句之间是嵌套关系,左边第二个语句是最外层,依次往右进一层,左边#第一条语句是最后一层。关于嵌套列表解析,从左到右的for语句顺序对应的是从外到里的层次关系。
+ 每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入。如果包定义文件 __init__.py 存在一个叫做 __all__ 的列表变量,那么在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入。
+ 可以使用 str.format() 函数来格式化输出值。str(): 函数返回一个用户易读的表达形式,repr(): 产生一个解释器易读的表达形式。
+ python的pickle模块实现了基本的数据序列和反序列化。
+ try...except raise finally
+ self代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。
+ 支持多继承、专有方法和运算符重载,__private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。
+ python cgi编程,与c cgi类似,只要webserver支持cgi调用即可,.py处理文件等同main.cgi
+ PyMySQL是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。
+ 多线程编程:每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。Python3 线程中常用的两个模块为:_thread、threading(推荐使用)。Python中使用线程有两种方式:函数或者用类来包装线程对象。除了使用方法外,线程模块同样提供了Thread类( threading.Thread)来处理线程。
+ python有三种方法解析XML,SAX,DOM,以及ElementTree
+ Python3 中可以使用 json 模块来对 JSON 数据进行编解码
+ 可选参数默认值的设置在Python中只会被执行一次。
##释疑
1、python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包。只要模块或者包所在的目录在sys.path中,就可以使用import模块或import 包来使用。如果你要使用的模块(py文件)和当前模块在同一目录,只要import相应的文件名就好,比如在a.py中使用b.py: import b ;
但是如果要import一个不同目录的文件(例如b.py)该怎么做呢? 首先需要使用sys.path.append方法将b.py所在目录加入到搜素目录中。然后进行import即可,例如 import sys ;sys.path.append('c:\xxxx') # 这个例子针对 windows 用户来说的,因为windows环境有转义字符,所以最好写成sys.path.append('c:\\xxxx') 。
一般在sublime里运行没有问题,但是在命令行里运行出现“xxx模块”找不到时就可以用上面这种方法,在使用到xxx模块的文件里用sys.path.append添加 xxx模块所在的路径即可解决此问题。
##python3.x相比于python2.x的变化
+ python3.x源码文件默认使用utf-8编码
+ 去除了<>,全部改用!=
+ 去除``,全部改用repr()
+ 关键词加入as 和with,还有True,False,None
+ 整型除法返回浮点数,要得到整型结果,请使用//
+ 去除print语句,加入print()函数实现相同的功能。同样的还有 exec语句,已经改为exec()函数
+ 改变了顺序操作符的行为,例如x<y,当x和y类型不匹配时抛出TypeError而不是返回随即的 bool值
+ 输入函数改变了,删除了raw_input,用input代替
+ 去除了long类型,现在只有一种整型——int,但它的行为就像2.X版本的long
+ 移除了cPickle模块,可以使用pickle模块代替。最终我们将会有一个透明高效的模块
+ Python 3.0在设计的时候没有考虑向下兼容