爱好
首先看视频自学,然后看书自学,最后报班学。
Python属于解释型语言,当程序运行时,是一行一行的解释并运行,调试程序简单,开发效率高。
特点:
语法简洁优美,功能强大,标准库与第三方库都非常强大。具有很强大的可移植性、可扩展性、可嵌入性。
缺点:运行速度慢
解释型:就是边解释边执行
编译型:编译后再执行
CPython
当我们从Python官方网站下载并安装好Python 3.6后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。
CPython是使用最广的Python解释器。教程的所有代码也都在CPython下执行。
IPython
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。好比很多国产浏览器虽然外观不同,但内核其实都是调用了IE。
CPython用>>>作为提示符,而IPython用In [序号]:作为提示符。
PyPy
PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。
绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,就需要了解PyPy和CPython的不同点。
Jython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
IronPython
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
1字节 = 8位
1B = 8 b
1KB = 1024 B
1MB = 1024 KB
1 GB = 1024 MB
1、使用4个空格而不是tab键进行缩进。
2、每行长度不能超过79
3、使用空行来间隔函数和类,以及函数内部的大块代码
4、必要时候,在每一行下写注释
5、使用文档注释,写出函数注释
6、在操作符和逗号之后使用空格,但是不要在括号内部使用
7、命名类和函数的时候使用一致的方式,比如使用CamelCase来命名类,使用lower_case_with_underscores来命名函数和方法
8、在类中总是使用self来作为默认
9、尽量不要使用魔法方法
10、默认使用UTF-8,甚至ASCII作为编码方式
11、换行可以使用反斜杠,最好使用圆括号。
# 二进制转换成十进制
v = "0b1111011"
b = int(v,2)
print(b) # 123
# 十进制转换成二进制
v2 = 18
print(bin(int(v2)))
# 0b10010
# 八进制转换成十进制
v3 = "011"
print(int(v3))
# 11
# 十进制转换成八进制
v4 = 30
print(oct(int(v4)))
# 0o36
# 十六进制转换成十进制
v5 = "0x12"
print(int(v5,16))
# 18
# 十进制转换成十六进制
v6 = 87
print(hex(int(v6)))
# 0x57
def bin_to_dec(obj):
return int(''.join([bin(int(x))[2:].rjust(8, '0') for x in obj.split('.')]), 2)
print(bin_to_dec('127.0.0.1'))
# 2130706433
998
print(1 or 3) # 1
print(1 and 3) # 3
print(0 and 2 and 1) # 0
print(0 and 2 or 1) # 1
print(0 and 2 or 1 or 4) # 1
print(0 or False and 1) # False
总结:
优先级:not > and > or
ascii 最多只能用8位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号。
unicode 万国码,任何一个字符用两个字节表示
utf-8 万国码的升级版 一个中文字符用三个字节 英文用一个字节 欧洲用2个字节
gbk 国内版本 一个中文字符用2个字节 英文用一个字节
机器码,学名机器语言指令,有时也被称为原生码,是电脑的CPU可直接解读的数据。
字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。
# 语法
# 结果1 if 条件 else 结果2
# 若条件成立返回结果1,不成立返回结果2
print(1 if 2 > 1 else 2)
# 1
1:打印时,py2需要可以不需要加括号,py3 需要
python 2 :print (‘lili’) , print ‘lili’
python 3 : print (‘lili’)
python3 必须加括号
exec语句被python3废弃,统一使用exec函数
2:内涵
Python2:1,臃肿,源码的重复量很多。
2,语法不清晰,掺杂着C,php,Java,的一些陋习。
Python3:几乎是重构后的源码,规范,清晰,优美。
3、输出中文的区别
python2:要输出中文 需加 # -- encoding:utf-8 --
Python3 : 直接搞
4:input不同
python2 :raw_input
python3 :input 统一使用input函数
5:指定字节
python2在编译安装时,可以通过参数-----enable-unicode=ucs2 或-----enable-unicode=ucs4分别用于指定使用2个字节、4个字节表示一个unicode;
python3无法进行选择,默认使用 ucs4
查看当前python中表示unicode字符串时占用的空间:
impor sys
print(sys.maxunicode)
#如果值是65535,则表示使用usc2标准,即:2个字节表示
#如果值是1114111,则表示使用usc4标准,即:4个字节表示
6:py2:xrange
range
py3:range 统一使用range,Python3中range的机制也进行修改并提高了大数据集生成效率
7:在包的知识点里
包:一群模块文件的集合 + __init__
区别:py2 : 必须有__init__
py3:不是必须的了
8:不相等操作符"<>“被Python3废弃,统一使用”!="
9:long整数类型被Python3废弃,统一使用int
10:迭代器iterator的next()函数被Python3废弃,统一使用next(iterator)
11:异常StandardError 被Python3废弃,统一使用Exception
12:字典变量的has_key函数被Python废弃,统一使用in关键词
13:file函数被Python3废弃,统一使用open来处理文件,可以通过io.IOBase检查文件类型
a,b = b,a
在python3里,只有一种整数类型int,大多数情况下,和python2中的长整型类似。
都在循环时使用,xrange内存性能更好,xrange用法与range完全相同,range一个生成list对象,xrange是生成器
要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间。
在Python3中range实现和xrange一致,xrange被舍弃
readlines返回列表
xreadlines返回生成器
0,“”,{},[],(),set()
# 语法
# 函数名 = lambda 参数:返回值
print(list(map(lambda x:x*x, [1, 2, 3, 4])))
# [1, 4, 9, 16]
pass是空语句,是为了保持程序结构的完整性。pass 不做任何事情,一般用做占位语句。
*args代表位置参数,它会接收任意多个参数并把这些参数作为元祖传递给函数。
**kwargs代表的关键字参数,返回的是字典,位置参数一定要放在关键字前面
is用于判断内存地址是否一致
==判断值是否一致
浅拷贝只是增加了一个指针指向一个存在的地址,
而深拷贝是增加一个指针并且开辟了新的内存,这个增加的指针指向这个新的内存,采用浅拷贝的情况,释放内存,会释放同一内存,深拷贝就不会出现释放同一内存的错误
# 浅拷贝 指向共有的地址
li1 = [1, 2, 3, [4, 5], 6]
li2 = li1.copy()
li1[3].append(7)
print(li1, li2) # [1, 2, 3, [4, 5, 7], 6] [1, 2, 3, [4, 5, 7], 6]
# 深拷贝 重指向
li1 = [1, 2, 3, [4, 5], 6]
li2 = copy.deepcopy(li1)
li1[3].append(7)
print(li1, li2) # [1, 2, 3, [4, 5, 7], 6] [1, 2, 3, [4, 5], 6]
引用计数、标记清除、分代回收
可变数据类型:列表、字典、可变集合
不可变数据类型:数字、字符串、元组、不可变集合
def multipliers():
return [lambda x:i*x for i in range(4)]
print([m(2) for m in multipliers()])
# [6,6,6,6]
v = dict.fromkeys(['k1', 'k2'], [])
v['k1'].append(666)
print(v) # {'k1': [666], 'k2': [666]}
v['k1'] = 777
print(v) # {'k1': 777, 'k2': [666]}
# 分析:创建字典时k1和k2指向同一个空列表,往k1指向的空列表添加值,k2对应的值也改变
abs() # 求绝对值
map() # 映射
filter() # 过滤
isinstance # 判断一个对象是否是一个已知的类型,考虑继承
type() # 判断一个对象是否是一个已知的类型,不考虑继承
zip() # 拉链函数(压缩)
# filter 过滤
print(list(filter(lambda x: x > 2, [1, 2, 3, 4]))) # [3, 4]
# map 映射
print(list(map(abs, [-1, -2, -3, 4]))) # [1, 2, 3, 4]
# reduce 累计操作
from functools import reduce
print(reduce(lambda x, y: x + y, [1, 2, 3, 4])) # 10
print('\n'.join([' '.join([str(x)+'*'+str(y)+'='+str(x*y) for y in range(1,x+1)])for x in range(1,10)]))
pip install
re模块,os模块,json模块,time模块,functools模块
match从字符串起始位置开始匹配
search扫描整个字符串返回第一个成功的匹配
匹配一个字符串没有节制,能匹配多少就匹配多少
print([ i % 2 for i in range(10) ]) # [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
print([ i for i in range(10) ]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(( i % 2 for i in range(10) )) # at 0x000001CFF36516D0> 返回一个生成器
1 or 2 # 1
1 and 2 # 2
1 < (2 == 2) # False
1 < 2 == 2 # True
def func(a,b = []):
b.append(a)
return b
print(func(1)) # [1]
print(func(2)) # [1, 2]
每次调用func如果不传入b,则b都指向同一个列表
print("1,2,3".split(',')) # ['1', '2', '3']
print([int(x) for x in ['1', '2', '3']])
a表示含有3个数字的列表
b表示含有3个数字的列表,但每个数字经过()运算,故a is not b
c表示含有3个元组的列表,每个元组含有一个数字
print([i*i for i in range(1,11)]) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
print(list(set([1, 2, 3, 4, 45, 1, 2, 343, 2, 2]))) # [1, 2, 3, 4, 45, 343]
a = 1
def func(oj):
global a
a = oj
return a
print(a) # 1
print(func(3)) # 3
print(a) # 3
占位符%
format
迭代器
含有__iter__
和__next__
方法 (包含__next__
方法的可迭代对象就是迭代器)
生成器
包括含有yield这个关键字,生成器也是迭代器,调动next把函数变成迭代器。
可迭代对象
一个类内部实现__iter__
方法且返回一个迭代器。
def foo():
m=3
n=5
def bar():
a=4
return m+n+a
return bar
print(foo()()) # 12
bar在foo函数的代码块中定义。我们称bar是foo的内部函数。
在bar的局部作用域中可以直接访问foo局部作用域中定义的m、n变量。
简单的说,这种内部函数可以使用外部函数变量的行为,就叫闭包。
os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;
sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。
random模块
os.remove()
面对对象是一种编程思想,以类的眼光来来看待事物的一种方式。将有共同的属性和方法的事物封装到同一个类下面。
继承:将多个类的共同属性和方法封装到一个父类下面,然后在用这些类来继承这个类的属性和方法
封装:将有共同的属性和方法封装到同一个类下面
多态:Python天生是支持多态的。指的是基类的同一个方法在不同的派生类中有着不同的功能
继承概念的实现方式主要有2类:实现继承、接口继承。
实现继承是指使用基类的属性和方法而无需额外编码的能力;
接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法);
python 两种类:经典类 新式类
python3 新式类 —— 都默认继承object class Animal(object): == class Animal:
python2 经典类和新式类 并存
class Animal: 经典类 —— 继承顺序 个别使用方法
class Animal(object): 新式类
继承分为单继承和多继承
Python是支持多继承的
如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。
Python的类可以继承多个类,Python的类如果继承了多个类,那么其寻找方法的方式有两种
当类是经典类时,多继承情况下,会按照深度优先方式查找 py3
当类是新式类时,多继承情况下,会按照广度优先方式查找 py2
简单点说就是:经典类是纵向查找,新式类是横向查找
经典类和新式类的区别就是,在声明类的时候,新式类需要加上object关键字。在python3中默认全是新式类
用于子类继承基类的方法
wraps()用于装饰装饰器内部函数,使函数说明等依旧返回原函数
reduce()累计计算
__new__
:生成实例__init__
:生成实例的属性__call__
:实例对象加( )会执行def __call__
:… 方法里边的内容。__del__
:析构方法,当对象在内存中被释放时,自动触发执行。如当 del obj 或者应用程序运行完毕时,执行该方法里边的内容。__enter__
和__exit__
:出现with语句,对象的__enter__
被触发,有返回值则赋值给as声明的变量;with中代码块执行完毕时执行__exit__
里边的内容。__module__
:表示当前操作的对象在那个模块 obj.__module__
__class__
:表示当前操作的对象的类是什么 obj.__class__
__doc__
:类的描述信息,该描述信息无法被继承__str__
:改变对象的字符串显示 print函数 —>obj.__str__()
__repr__
:改变对象的字符串显示 交互式解释器 —>obj.__repr__()
`__format__`:自定制格式化字符串
__slots__
:一个类变量 用来限制实例可以添加的属性的数量和类型看他的调用者是谁,如果是类,就需要传入一个参数self的值,这时他就是一个函数,
如果调用者是对象,就不需要给self传入参数值,这时他就是一个方法
尽管 classmethod 和 staticmethod 非常相似,但在用法上依然有一些明显的区别。classmethod 必须有一个指向类对象的引用作为第一个参数,而 staticmethod 可以没有任何参数。
# 反射的核心本质就是以字符串的形式去导入个模块,利用字符串的形式去执行函数。
hasattr()
getattr()
setattr()
delattr()
含义:装饰器本质就是函数,为其他函数添加附加功能
原则:
不修改被修饰函数的代码
不修改被修饰函数的调用方式
应用场景:
无参装饰器在用户登录 认证中常见
有参装饰器在flask的路由系统中见到过
from functools import wraps
def func(fun):
@wraps(fun)
def wrapper(*args, **kwargs):
print("Hello")
return fun(*args, **kwargs)
return wrapper
@func
def show():
print("show")
show()
# Hello
# show
try:
pass
except ValueError:
pass
# raise语法
# raise [Exception [, args [, traceback]]]
# 语句中 Exception 是异常的类型,args 是自已提供的异常参数。
方法解析顺序
isinstance(对象,类) 判断这个对象是不是这个类或者这个类的子类的实例化
class Foo:
pass
class Bar(Foo):
pass
f = Foo()
b = Bar()
print(isinstance(b, Bar)) # True
print(isinstance(f, Foo)) # True
print(isinstance(b, Foo)) # True
在序列化时,中文汉字总是被转换为unicode码,在dumps函数中添加参数ensure_ascii=False即可解决。
条件成立(布尔值为True)则继续往下,否则抛出异常,一般用于:满足某个条件之后,才能执行,否则应该抛出异常。
assert condition
li = [1, 2]
assert len(li) >= 5, "列表元素小于5"
Traceback (most recent call last):
File "D:/python/test1/day06.py", line 41, in <module>
assert len(li) >= 5, "列表元素小于5"
AssertionError: 列表元素小于5