Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。具有丰富的第三方库,官方库中也有相应的功能模块支持,覆盖了网络、文件、GUI、数据库、文本等大量内容。
__name__属性:
每个模块都有一个__name__属性,当其值是'__main__'时(双下划线),表明该模块自身在运行,否则是被引入。
#!/usr/bin/python3
# Filename: using_name.py
...
if __name__ == '__main__':
print('程序自身在运行')
else:
print('我来自另一模块')
开发规范
Python中逻辑层次通过缩进(空格或Tab)进行界定,从而决定语句的分组:
同一层次语句必须有相同的缩进:每一组这样的语句称为一个块;
一般每个缩进使用一个Tab;
逻辑判断(if)、循环(for)语句均以冒号(:)结尾,后续执行语句缩进;
Python中注释
单行注释:#,在linux下文件开头使用#做一些指示说明
#!/usr/bin/env python
# -*- coding:utf-8 -*-
多行注释:三个成对的单引号(或双引号)
语句跨行
三引号:作为字符串时,会引入换行符;
使用'\':在行尾使用\表示有更多行;
使用括号括起多个字符串:不只用于字符串,也可用于其他语句的分行(()[]{}括起的语句,可直接跨多行):
words = 'cats dog'\
' monkey'
animal = ('cat '
'dog')
if ( words is None
and animal is not None): #括号是必须的
变量与类型
python变量不需要预先声明:
初次赋值即为定义(根据赋值类型决定变量的类型);
但引用前必须保证变量已定义(赋值过);
已定义的变量可通过del(del var)来删除,删除后就不能再引用了。
python按如下顺序查找变量:当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量。
全局变量通过global关键字引入(否则函数内部所有定义的都为局部变量);使用nonlocal关键字引入外层作用域(非全局)变量:具体参见:
python3变量与类型说明
六种标准数据类型:
数字:int、float、bool(True、False)、complex;
int整型没有大小限制,只与内存有关;
复数complex中使用j表示虚数部分:1+2j;
math库提供数字操作,cmath库提供复数操作;
字符串:str;
+:连接字符串;
*:多次复制字符串,'12'*3为'121212';
列表:list,[a,b...]
元组:tuple,(a,c...)
定义只有一个元素的元组时,后面要带逗号:如("mytuple",)若没有逗号,则作为字符串处理。
集合:set,
空集合只能用set()来创建;
set('quant')->{'q','u','a','n','t'}
{'quant'}->{'quant'}
字典:dict,
{}:是创建空字典,创建空集合只能通过set();
字符串:python3中字符串使用Unicode编码
单引号:可包含双引号;
双引号:可包含单引号;
三引号(三个单或双引号):可以跨多行(可用作注释);
raw字符串:以r开始,使转义失效(r"test\wend"),在正则表达式中非常有用;
常用类型转换:
int(x [,base ]):将x转换为一个整数
float(x):将x转换到一个浮点数
complex(real [,imag ]):创建一个复数
str(x):将对象 x 转换为字符串
repr(x):将对象 x 转换为表达式字符串
eval(str):计算在字符串中的有效Python表达式,并返回一个对象
tuple(s):将序列 s 转换为一个元组
list(s):将序列 s 转换为一个列表
chr(x):将一个整数转换为一个字符
unichr(x):将一个整数转换为Unicode字符
ord(x):将一个字符转换为它的整数值
hex(x):将一个整数转换为一个十六进制字符串
oct(x):将一个整数转换为一个八进制字符串
变量类型判断,python提供内置函数用于类型判断:
type(var):获取变量类型;
isinstance(var, type):判断是否为指定类型;
type不处理继承关系;判断子类型是否为父类型,需要使用isinstance。
is(身份id运算符)与==:
is:两个对象是否完全相同(id相同,指向同一个地址);速度快
判断是否为None时推荐用is;
相当于id(a)==id(b);
==:比较对象的值是否相等;相等的两个变量,id可能不同。
序列与集合:列表解析与迭代见python3迭代器与生成器
序列指其中对象从0开始依次编号,有前后顺序关系;如列表、元组、字符串;
映射是无序的键与值的映射关系;如字典;
集合记录某些无顺序关系的不可变对象是否存在于其中,其中没有重复的元素;如集合set;
序列切片(Slice),可用于操作列表、元组、字符串:
切片是获取 [start:end:interval]范围内值,返回[start, end),即不包括end元素;三者的取值可正可负,也可省略(start默认0,end默认列表长度,interval默认1),全部省略为列表复制;
列表每个数字对应正、负两个索引(正索引左起,从0开始;负索引右起,-i即为len-i处,如-1为最后一个元素),第一个元素对应的下标为0,最后一个元素对应的下标为-1;
interval中的正负号规定了取数的方向是从左到右(+)还是从右到左(-)。如果有interval,先确定其方向(没有的话默认为从左到右取值)。
列表增减元素:
L.append(object) :是将一个对象作为一个整体添加到列表中,添加后的列表比原列表多一个元素;
L.extend(iterable):是将一个可迭代对象中的每个元素逐个地添加到列表中,可迭代对象中有几个元素,添加后的列表就比原列表多几个元素;
L.pop(index):是按索引号来删除列表中对应的元素,并返回该元素;若空,即pop(),将删除最后一个元素;
L.remove(value): 是根据参数value在列表中查找,若找到某个元素的值和参数相等,则将该元素删除,若没有找到,则抛出异常;
基本语句
pass语句:属于空(null)操作,作为占位语句,用于必须有语句但有没有任何操作时;
三元操作:a=X if expression else Z
expression为true,a为X;否则为Z
条件判断语句
if condition_1:
statement_block_1
elif condition_2:
statement_block_2
else:
statement_block_3
循环语句: for 和 while(continue与break可中断循环)
While循环
while :
条件满足时执行的语句
[else: #执行完循环后会执行
条件不满足时执行的语句
]
For循环
for in :
条件满足时执行的语句
[else:#执行完循环后会执行
条件不满足时执行的语句
]
for与range组合
#for _ in range(10)#若不需要序号,可使用下划线
for i in range(10)
print(i) #打印0...9
range内置函数
range(stop) #返回[0 .. Stop)
range(start, stop[, step]) #返回[Start, Stop),step默认为1(若为负数,则需要stop
运算符
比较运算符:==、!=;
成员运算符:in与not in,判断元素是否在集合中;
逻辑运算符:and、or、not;
身份运算符:is与is not,判断两个标识符是否引用同一个对象;
算术运算符
在字符串运算中:
+:字符串连接
*:重复输出字符串、元组、列表
%:格式化字符串;格式化见python3输入输出与字符串格式化
位运算符
函数
函数是组织好的、可重复使用的代码段(参数见python可变参数与关键字参数)
def (arg1,...argN)
return [expression]
匿名函数:
lambda [arg1, ...argN]: expression
冒号前可有多个参数(也可没有);
冒号后只能是一个表达式(不能是代码块),表达式的结果即为返回值;
整个lambda就是一个表达式;
类,面向对象
类是定义具有相同属性和方法的集合(Python类、变量属性及方法),对象是类的实例:
class ClassName:
Python支持多继承形式。多继承的类定义形如下例:
class DerivedClassName(Base1, Base2, Base3):
圆括号中父类的顺序会影响方法调用:若父类中有相同的方法名,而在子类调用时未指定,python从左至右搜索(即方法在子类中未找到时,从左到右查找父类中是否包含方法)。
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是self:
class Test:
def prt(self):
print(self)
print(self.__class__)
t = Test()
t.prt()
模块与包
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块。python解释器在启动时会自动加载一些模块,可以使用sys.modules查看
import module1[, module2[,... moduleN]
import spam as sm #sm为spam的别名
from modname import name1[, name2[, ... nameN]]
优点:方便,不用加前缀
缺点:容易跟当前文件的名称空间冲突
from spam import read1 as read
from spam import * #所有的不是以下划线(_)开头的名字都导入到当前位置,
__all__来控制import*(可用于控制新版本发布)
如:__all__=['money','read1'] #from spam import *就只会导入这两个
包是模块的结构化管理思想:
由模块文件构成(众多相关功能的模块文件结构化组合成包);
是一种通过使用‘.模块名’来组织python模块名称空间的方式。
包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__int__.py用于标识当前文件夹是一个包。
第一次导入包或者是包的任何其他部分,都会依次执行包下的__init__.py文件
无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法。.的左边必须是包。
Python 中,有大量的内置模块,模块中的定义(例如:变量、函数、类)众多,不可能全部都记住,这时 dir() 函数就非常有用了。
dir() 是一个内置函数,用于列出对象的所有属性及方法(返回list)。
如果 dir() 没有参数,则返回当前作用域中的名称列表;否则,返回给定 object 的一个已排序的属性名称列表。
如果对象提供了 __dir__() 方法,则它将会被使用;否则,使用默认的 dir() 逻辑,并返回。
使用 dir() 可以查看指定模块中定义的名称,它返回的是一个已排序的字符串列表。
__builtins__:内建模块,dir(__builtins__)列出内建对象
领取专属 10元无门槛券
私享最新 技术干货