Python学习

文章目录

  • Python学习笔记
    • 编程语言划分
    • 字符编码
        • 32位和64位的区别?
    • Python简介
    • Python特点
    • 执行py程序的方式
    • Python 环境变量
    • 编码
    • 标识符
    • Python保留字
    • 注释
    • 行与缩进
    • 多行语句
    • import 与 from...import
    • Python3基本数据类型
    • Number(数字)
    • String(字符串)
    • List(列表)
    • Tuple(元组)
    • Set(集合)
    • Dictionary(字典)
    • Python数据类型转换
    • 运算符
    • Python算术运算符
    • Python位运算符
    • Python逻辑运算符
    • Python成员运算符
    • Python身份运算符
    • 深浅拷贝
    • Python函数
    • 作用域
    • 高阶函数
    • 闭包
    • 内置函数
    • 装饰器(函数,代理proxy)
    • 生成器&迭代器
    • 生成器的创建方式
    • send() 方法
    • 模块的概念
    • 模块导入
    • time模块
    • datetime模块
    • random模块
    • os模块
    • sys模块
    • hashlib模块
    • logging模块
    • configparser模块
    • 正则表达式
    • 序列化
    • str&eval
    • JSON
    • Pickle
    • Shelve
    • XML
    • 类成员
    • 成员修饰符
    • 特殊成员
    • metaclass
    • 异常处理
    • 断言 assert
    • 反射
    • 单例模式
    • 网络通信要素
    • socket()函数


Python学习笔记

编程语言划分

  1. 编译型和解释型(Java属于混合型)

    • 编译型:C/C++
    • 解释型:JavaScript、Python
  2. 动态语言和静态语言

    • 动态语言:不用指定数据类型
    • 静态语言:在编译的时候检查数据类型
  3. 强类型和弱类型

字符编码

Python学习_第1张图片

  • 1B bytes
  • 1KB Kilobyte
  • 1MB Megabyte
  • 1GB Gigabyte
  • 1TB Trillionbyte
  • 1PB Petabyte
  • 1EB Exabyte
  • 1ZB Zettabyte
  • 1YB Yottabyte
  • 1BB Brontobyte

32位和64位的区别?

  1. 对操作系统来说,64位和32位指最大内存寻址空间。32位最大4GB,64位理论上16EB,但现在一般都是2^48。
  2. 对硬件来说,64位和32位指数据宽度。64位一次取8字节也就是64bit,32取4字节也就是32bit,所以理论上64位比32位性能提高了一倍。实际上的情况是,达不到,内存变大了,需要寻址更多。
  3. 对应用程序来说,应用程序基于操作系统和硬件,其使用的指令宽度随系统和硬件变化。

Python简介

Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。
Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。

  • Python是一种解释型语言:这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。
  • Python是交互式语言:这意味着可以在一个Python提示符,直接互动执行写你的程序。
  • Python是面向对象语言:这意味着Python支持面向对象的风格或代码封装在对象的编程技术。
  • Python是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发。

Python特点

  • 易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。 易于阅读:Python代码定义的更清晰。
  • 易于维护:Python的成功在于它的源代码是相当容易维护的。
  • 一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好。
  • 互动模式:互动模式的支持,您可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片断。
  • 可移植:基于其开放源代码的特性,Python已经被移植(也就是使其工作)到许多平台。
  • 可扩展:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那部分程序,然后从你的Python程序中调用。
  • 数据库:Python提供所有主要的商业数据库的接口。
  • GUI编程:Python支持GUI可以创建和移植到许多系统调用。
  • 可嵌入:你可以将Python嵌入到C/C++程序,让你的程序的用户获得”脚本化”的能力。

执行py程序的方式

  1. 通过交互器执行,主要用于语法测试
    在交互模式中,最后被输出的表达式结果被赋值给变量 _ 。
  2. 文件执行

Python 环境变量

变量名 描述
PYTHONPATH PYTHONPATH是Python搜索路径,默认我们import的模块都会从PYTHONPATH里面寻找。
PYTHONSTARTUP Python启动后,先寻找PYTHONSTARTUP环境变量,然后执行此变量指定的文件中的代码。
PYTHONCASEOK 加入PYTHONCASEOK的环境变量, 就会使python导入模块的时候不区分大小写。
PYTHONHOME 另一种模块搜索路径。它通常内嵌于的PYTHONSTARTUP或PYTHONPATH目录中,使得两个模块库更容易切换。

编码

默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。

标识符

  • 第一个字符必须是字母表中字母或下划线 _ 。
  • 标识符的其他的部分由字母、数字和下划线组成。
  • 标识符对大小写敏感。

Python保留字

保留字即关键字,我们不能把它们用作任何标识符名称。Python 的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字:

>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

注释

单行注释:#
多行注释:多个#、’’‘xxx’’’、""“xxx”""

行与缩进

Python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {} 。
缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。

多行语句

Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠()来实现多行语句,例如:

total = item_one + \
        item_two + \
        item_three

在 [], {}, 或 () 中的多行语句,不需要使用反斜杠(),例如:

total = ['item_one', 'item_two', 'item_three',
        'item_four', 'item_five']

import 与 from…import

在 python 用 import 或者 from…import 来导入相应的模块。

  • 将整个模块(somemodule)导入,格式为: import somemodule
  • 从某个模块中导入某个函数,格式为: from somemodule import somefunction
  • 从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc
  • 将某个模块中的全部函数导入,格式为: from somemodule import *

Python3基本数据类型

Python3 中有六个标准的数据类型:

  • Number(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Set(集合)
  • Dictionary(字典)

Python3 的六个标准数据类型中:
不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。

多个变量赋值
Python允许你同时为多个变量赋值。例如:

a = b = c = 1

也可以为多个对象指定多个变量。例如:

a, b, c = 1, 2, "tonkia"

Number(数字)

Python3 支持 int、float、bool、complex(复数)

isinstance 和 type 的区别在于:

  • type()不会认为子类是一种父类类型。
  • isinstance()会认为子类是一种父类类型。

注意:在 Python2 中是没有布尔型的,它用数字 0 表示 False,用 1 表示 True。到 Python3 中,把 True 和 False 定义成关键字了,但它们的值还是 1 和 0,它们可以和数字相加。

Python支持复数,复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型。

1、Python可以同时为多个变量赋值,如a, b = 1, 2。
2、一个变量可以通过赋值指向不同类型的对象。
3、数值的除法包含两个运算符:/ 返回一个浮点数,// 返回一个整数。
4、在混合计算时,Python会把整型转换成为浮点数。

String(字符串)

Python中的字符串用单引号 ’ 或双引号 " 括起来,同时使用反斜杠 \ 转义特殊字符。

字符串的截取的语法格式如下:

变量[头下标:尾下标]

索引值以 0 为开始值,-1 为从末尾的开始位置。
Python学习_第2张图片

加号 + 是字符串的连接符, 星号 * 表示复制当前字符串,紧跟的数字为复制的次数。

Python 没有单独的字符类型,一个字符就是长度为1的字符串。

1、反斜杠可以用来转义,使用r可以让反斜杠不发生转义。
2、字符串可以用+运算符连接在一起,用*运算符重复。
3、Python中的字符串有两种索引方式,从左往右以0开始,从右往左以-1开始。
4、Python中的字符串不能改变。

List(列表)

List(列表) 是 Python 中使用最频繁的数据类型。

列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)。

列表是写在方括号 [] 之间、用逗号分隔开的元素列表。

和字符串一样,列表同样可以被索引和截取,列表被截取后返回一个包含所需元素的新列表。

列表截取的语法格式如下:

变量[头下标:尾下标]

加号 + 是列表连接运算符,星号 * 是重复操作。

与Python字符串不一样的是,列表中的元素是可以改变的

1、List写在方括号之间,元素用逗号隔开。
2、和字符串一样,list可以被索引和切片。
3、List可以使用+操作符进行拼接。
4、List中的元素是可以改变的。

Tuple(元组)

元组(tuple)与列表类似,不同之处在于元组的元素不能修改。元组写在小括号 () 里,元素之间用逗号隔开。

元组中的元素类型也可以不相同。

string、list和tuple都属于sequence(序列)。

1、与字符串一样,元组的元素不能修改。
2、元组也可以被索引和切片,方法一样。
3、注意构造包含0或1个元素的元组的特殊语法规则。
4、元组也可以使用+操作符进行拼接。

Set(集合)

集合(set)是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员。

基本功能是进行成员关系测试和删除重复元素。

可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

创建格式:

parame = {value01,value02,...}
或者
set(value)

集合的运算和操作

student = {'Tom', 'Jim', 'Mary', 'Tom', 'Jack', 'Rose'}
 
print(student)   # 输出集合,重复的元素被自动去掉
 
# 成员测试
if 'Rose' in student :
    print('Rose 在集合中')
else :
    print('Rose 不在集合中')
 
 
# set可以进行集合运算
a = set('abracadabra')
b = set('alacazam')
 
print(a)
 
print(a - b)     # a和b的差集
 
print(a | b)     # a和b的并集
 
print(a & b)     # a和b的交集
 
print(a ^ b)     # a和b中不同时存在的元素

以上实例输出结果:

{'Mary', 'Jim', 'Rose', 'Jack', 'Tom'}
Rose 在集合中
{'b', 'a', 'c', 'r', 'd'}
{'b', 'd', 'r'}
{'l', 'r', 'a', 'c', 'z', 'm', 'b', 'd'}
{'a', 'c'}
{'l', 'r', 'z', 'm', 'b', 'd'}

Dictionary(字典)

字典(dictionary)是Python中另一个非常有用的内置数据类型。

列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

字典是一种映射类型,字典用"{ }"标识,它是一个无序的键(key) : 值(value)对集合。

键(key)必须使用不可变类型。

在同一个字典中,键(key)必须是唯一的。

dict = {}
dict['one'] = "1 - 菜鸟教程"
dict[2]     = "2 - 菜鸟工具"
 
tinydict = {'name': 'runoob','code':1, 'site': 'www.runoob.com'}
 
 
print (dict['one'])       # 输出键为 'one' 的值
print (dict[2])           # 输出键为 2 的值
print (tinydict)          # 输出完整的字典
print (tinydict.keys())   # 输出所有键
print (tinydict.values()) # 输出所有值

以上实例输出结果:

1 - 菜鸟教程
2 - 菜鸟工具
{'name': 'runoob', 'code': 1, 'site': 'www.runoob.com'}
dict_keys(['name', 'code', 'site'])
dict_values(['runoob', 1, 'www.runoob.com'])

另外,字典类型也有一些内置的函数,例如clear()、keys()、values()等。

注意:

1、字典是一种映射类型,它的元素是键值对。
2、字典的关键字必须为不可变类型,且不能重复。
3、创建空字典使用 { }。

Python数据类型转换

有时候,我们需要对数据内置的类型进行转换,数据类型的转换,你只需要将数据类型作为函数名即可。

以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。

函数 描述
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 转换为一个列表
set(s) 转换为可变集合
dict(d) 创建一个字典。d 必须是一个序列 (key,value)元组
frozenset(s) 转换为不可变集合
chr(x) 将一个整数转换为一个字符
ord(x) 将一个字符转换为它的整数值
hex(x) 将一个整数转换为一个十六进制字符串
oct(x) 将一个整数转换为一个八进制字符串

运算符

  • 算术运算符
  • 比较(关系)运算符
  • 赋值运算符
  • 逻辑运算符
  • 位运算符
  • 成员运算符
  • 身份运算符
  • 运算符优先级

Python算术运算符

算符 描述
% 取模
**
// 取整除

Python位运算符

算符 描述
& 按位与运算符
| 按位或运算符
^ 按位异或运算符
~ 按位取反运算符
<< 左移动运算符
>> 右移动运算符

Python逻辑运算符

and
or
not

Python成员运算符

除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。

算符 描述
in 如果在指定的序列中找到值返回True,否则返回False
not in 如果在指定的序列中没有找到值返回True,否则返回False

Python身份运算符

身份运算符用于比较两个对象的存储单元

算符 描述 实例
is is 是判断两个标识符是不是引用自一个对象 x is y , 类似 id(x) == id(y) ,如果引用的是同一个对象则返回 True,否则返回 False
is not is not 是判断两个标识符是不是引用自不同对象 x is not y ,类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False

注: id() 函数用于获取对象内存地址。

深浅拷贝

浅拷贝:只拷贝一层 shallow copy
深拷贝 deep copy

a=[[1,2,3],4,5,6]
b=a
c=a.copy() #浅拷贝

Python函数

1、代码重用
2、保持一致性
3、可扩展性

def f(a,b=x,*c,**d):
	pass
#  a 必需参数
#  b 默认参数(缺省参数)
#  c 不定长参数
#  a必须在b和d的左边,b必须在a的右边d的左边,c必须在a 的右边d的左边

def f(a,*b,c=x,**d):
	pass

如果单独出现星号 * 后的参数必须用关键字传入。

>>> def f(a,b,*,c):
...     return a+b+c
... 
>>> f(1,2,3)   # 报错
Traceback (most recent call last):
  File "", line 1, in 
TypeError: f() takes 2 positional arguments but 3 were given
>>> f(1,2,c=3) # 正常
6
>>>

作用域

LEGB

Local局部作用域 函数中定义的变量
Enclosing嵌套的父级函数的局部作用域
Global全局变量,模块级别定义的变量
Built-in 最外层,系统固定模块里面的变量

变量搜索的顺序为 LEGB (自内由外)

访问全局 global

>>> a=10
>>> def f():
...     def ff():
...             global a
...             a=5
...     ff()
...
>>> a
10
>>> f()
>>> a
5
>>>

访问父级局部变量 nonlocal (python3新增,闭包)

高阶函数

在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:
接受一个或多个函数作为输入
输出一个函数

闭包

如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)

>>> def outer():
...     a=10
...     def inner(): #条件一:一个内部函数
...             nonlocal a #条件二:外部环境的一个变量
...             print(a)
...             a-=5
...     return inner
...
>>> f=outer()
>>> f()
10
>>> f()
5
>>> f()
0
>>> f()
-5

内置函数

filter()

str=['a','b','c','d']
def func(s):
	if s!='a':
		return s
res=filter(func,str)
print(res)

map()

reduce(function,seq)
from functools import reduce

>>> def f(a,b):
...     return a+b
... 
>>> reduce(f,range(1,10))
45
>>> 

lambda

lambda x,y:x+y

def f(x,y):
	return x+y

>>> reduce(lambda x,y:x*y,range(1,10))
362880
>>> 

装饰器(函数,代理proxy)

import time
def foo():
	print("foo() run")
	time.sleep(2)

def show_time(f):
	def wrapper():
		start = time.time()
		f()
		end = time.time()
		print("total time is :",end-start)
	return wrapper

foo = show_time(foo)
foo()

注释法装饰器

import time

@show_time  # foo = show_time(foo)
def foo():
	print("foo() run")
	time.sleep(2)
	
def show_time(f):
	def wrapper():
		start = time.time()
		f()
		end = time.time()
		print("total time is :",end-start)
	return wrapper

foo()

带参数的装饰器

import time

def show_time(f):
	def wrapper(x,y):
		start = time.time()
		f(x,y)
		end = time.time()
		print("total time is",end-start)
	return wrapper


@show_time
def add(a,b):
	print("a+b is",a+b)
	time.sleep(1)

add(10,30)

不定长参数

import time
from functools import reduce

def show_time(f):
	def wrapper(*a):
		start = time.time()
		f(*a)
		end = time.time()
		print("total time is",end-start)
	return wrapper


@show_time
def add(*a):   
	print("sum is",reduce(lambda x,y:x+y,a))
	time.sleep(1)

add(10,30,60,45,21)

装饰器参数

import time
from functools import reduce

def logger(flag = False):
	def show_time(f):
		def wrapper(*a):
			start = time.time()
			f(*a)
			end = time.time()
			print("total time is",end-start)
			if flag:
				print("logger...")
		return wrapper
	return show_time

@logger(True) # 返回show_time的引用
# add = logger(True)(add)
def add(*a):
	print("sum is",reduce(lambda x,y:x+y,a))
	time.sleep(1)


add(10,30,60,45,21)

@logger()
def add(*a):
	print("sum is",reduce(lambda x,y:x+y,a))
	time.sleep(1)

add(53,45,-54,-100)

例子DEMO

#装饰器
def authenticate(type):
	def proxy(f):
		def wrapper():
			global loginState
			if not loginState:
				print(type)
				iacc = input("account>>:")
				ipwd = input("password>>:")
				if iacc==account and ipwd==pwd:
					f()
					loginState = True
			else:
				f()
		return wrapper
	return proxy



#进入主页
@authenticate("主页登录")
def home():
	print("welcome to home")

#进入其他页面
@authenticate("弹窗登录")
def opage():
	print("welcome to this page")


print("1)进入主页")
print("2)进入其他页面")

while True:
	choice=int(input("====>"))
	if choice == 1:
		home()
	else:
		opage()

生成器&迭代器

列表生成式

>>> a=[x**2 for x in range(10)]
>>> a
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>>

>>> def f(n):
...     return n**3
...
>>> a = [f(x) for x in range(10)]
>>> a
[0, 1, 8, 27, 64, 125, 216, 343, 512, 729]
>>>

一种赋值的形式

t = (1,2)
a,b = t    #赋值的左右边数目对等,不然会报错

a=1
b=2

生成器 (generator)

>>> s=(x for x in range(10))
>>> s
 at 0x003339B0>
>>>

#################################

>>> s=(x for x in range(10))
>>> s
 at 0x008A3F30>
>>>
>>> x=[s]
>>> x
[ at 0x008A3F30>] #列表
>>>
>>> print(s.__next__())
0
>>> print(s.__next__())
1
>>> print(s.__next__())
2
>>> print(s.__next__())
3
>>>

 #正确的迭代方法

>>> print(next(s))
4
>>> print(next(s))
5
>>> print(next(s))
6
>>>

#迭代结束
StopIteration

For循环 迭代

>>> s=(x for x in range(100))
>>> for i in s:
...     print(i)
...
0
1
2
3
4
5
6
7
8

生成器的创建方式

1、(x for x in range(10))
2、通过yield

>>>
>>> def foo():
...     yield 1
...
>>> print(foo)

>>> g=foo()
>>> g



########################################
def foo():
    print("step01")
    yield 1
    print("step02")
    yield 2
        
g=foo()
print(g)
print(next(g))
print(next(g))


step01
1
step02
2

########################################
def foo():
	print("step01")
	yield 1
	print("step02")
	yield 2

#g=foo()
#print(g)
#print(next(g))
#print(next(g))

print(next(foo()))
print(next(foo()))

step01
1
step01
1
    
########################################

def foo():
	print("step01")
	yield 1
	print("step02")
	yield 2

#for循环遍历可迭代对象
for x in foo():
	print(x)

可迭代对象:
内部有 __iter__() 方法的就是可迭代对象
字符串 (str)–> 迭代器
列表(list)–> 迭代器
元组(tuple)–> 迭代器
字典(dictionary)–> 迭代器
range对象 --> 迭代器

生成器 就是 迭代器

斐波拉契数列

def fib(max):
	n,a,b=0,0,1
	while n

send() 方法

def foo():
	print("step01")
	var = yield 1
	print("step02,var is",var)
	var = yield 2
	print("step03,var is",var)
	yield 3



b=foo()
# 第一次send前没有数据,只能send None 相当于next(b)
# TypeError: can't send non-None value to a just-started generator
print(b.send(None))
print(b.send("send msg01"))
print(b.send("send msg02"))

--------------------------------------------------------------------------------------------
step01
1
step02,var is send msg01
2
step03,var is send msg02
3

生成器和迭代器的关系:生成器都是迭代器

# 返回迭代器对象
b = a.__iter__()
b = iter(a)
# a可以为:str,list,tuple,dict,range 等可迭代对象

可迭代对象满足:有 __iter__() 方法
迭代器(协议)满足:有 __next()__ 方法和 __iter__() (返回的是自身,这样for循环就可以调用iter方法获取迭代器的迭代器进行迭代)

>>> a=[1,2,3,4,5]
>>> b=iter(a)
>>> b

>>> c=iter(b)
>>> c
  #返回的是自身
>>>
#########################################################
>>> s = (x for x in range(10))
>>> s
 at 0x03613F30>
>>> a = iter(s)
>>> a
 at 0x03613F30>
>>> a = s.__iter__()
>>> a
 at 0x03613F30>
>>> type(a)


# 生成器 既是可迭代对象 又是 迭代器
>>> print(isinstance(s,Iterator))
True
>>> print(isinstance(s,Iterable))
True

Python学习_第3张图片

模块的概念

一个.py文件就是一个模块

python标准库
第三方模块
应用程序自定义模块

模块导入

在 python 用 import 或者 from…import 来导入相应的模块。

  • 将整个模块(somemodule)导入,格式为: import somemodule
  • 从某个模块中导入某个函数,格式为: from somemodule import somefunction
  • 从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc
  • 将某个模块中的全部函数导入,格式为: from somemodule import *

time模块

>>> import time
>>> help(time)
Help on built-in module time:

NAME
    time - This module provides various functions to manipulate time values.

time.time() #it is generally January 1st, 1970 时间戳(timestamp)

时间戳(timestamp),一个能表示一份数据在某个特定时间之前已经存在的、 完整的、
可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间。

time.sleep(wait)

time.clock() #计算机CPU执行时间 (deprecated)

time.gmtime() #UTC

协调世界时(英语:Coordinated Universal Time,法语:Temps Universel
Coordonné,简称UTC)是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间。

#结构化时间
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=2, tm_min=58, tm_sec=33, tm_wday=6, tm_yday=287, tm_isdst=0)

time.localtime()

time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=11, tm_min=6, tm_sec=35, tm_wday=6, tm_yday=287, tm_isdst=0)

time.strftime()
%Y Year with century as a decimal number.
%m Month as a decimal number [01,12].
%d Day of the month as a decimal number [01,31].
%H Hour (24-hour clock) as a decimal number [00,23].
%M Minute as a decimal number [00,59].
%S Second as a decimal number [00,61].
ime zone offset from UTC.
%a Locale’s abbreviated weekday name.
%A Locale’s full weekday name.
%b Locale’s abbreviated month name.
%B Locale’s full month name.
%c Locale’s appropriate date and time representation.
%I Hour (12-hour clock) as a decimal number [01,12].
%p Locale’s equivalent of either AM or PM.

>>> print(time.strftime("%Y-%m-%d  %H:%M:%S",time.localtime()))
2018-10-14  11:14:58
>>>

time.strptime(str,format)

>>> a=time.strptime("2018-10-3","%Y-%m-%d")
>>> a
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=3, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=276, tm_isdst=-1)
>>>
#########################################################
a=time.strptime("2018-10--3","%Y-%m-%d")
#异常抛出
ValueError: time data '2018-10--3' does not match format '%Y-%m-%d'

time.ctime(seconds = None)

time.mktime()

时间戳、结构化时间、字符串表示时间

datetime模块

datetime.datetime.now()

>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2018, 10, 14, 11, 34, 44, 677554)
>>> print(datetime.datetime.now())
2018-10-14 11:34:57.501406
>>>

random模块

random.random()  # [0-1]
random.randint(x,y) # [x-y]
print( random.uniform(1.1,5.4) ) # 产生1.1到5.4之间的随机浮点数,区间可以不是整数
random.choice('hello') # 序列随机选择
random.randrange(1,100,2) # 生成从1到100的间隔为2的随机整数

a=[1,3,5,6,7]
random.shuffle(a) # 将序列a中的元素顺序打乱

random.sample(seq, count) #在seq中随机选count个

例子:生成随机验证码

import random
num=[x for x in range(ord('0'),ord('9')+1)]

letter=[x for x in range(ord('A'),ord('Z')+1)]

chs=num+letter

def gen_code(n):
	code=""
	for i in range(n):
		code+=chr(random.choice(chs))
	return code

print(gen_code(5))

os模块

os模块与系统进行交互

os.getcwd():获取当前的工作目录
os.chdir(“dirname”):改变当前工作目录
os.curdir()
os.pardir()
os.makedirs():生成多层文件夹

>>> os.makedirs('a/b/c/d')

>>> os.makedirs(r"aaa\bbb\ccc")
# r"xxxx" 原生字符串

os.removedirs():删除文件夹,只能删除空文件夹
os.mkdir():生成文件夹
os.rmdir():删除文件夹

os.listdir()
os.rename(“oldname”,“newname”)
os.stat():获取文件/目录信息

>>> import os
>>> os.stat("1.py")
os.stat_result(st_mode=33206, st_ino=844424930135521, st_dev=2595844500, st_nlink=1, st_uid=0, st_gid=0, st_size=747, st_atime=1539442940, st_mtime=1539431934, st_ctime=1539425162)
# st_size 文件大小
# atime 上一次访问时间
# mtime 上一次修改时间
# ctime 创建时间
>>>

os.sep():路径分隔符
os.linesep()

‘\r\n’ Windows
‘\n’ Linux
‘\r’ Mac os

os.pathsep():路径分隔符

; Windows
: Linux

os.name:不是方法,系统

nt Windows
posix Linux

os.system(“bash command”)

os.environ:环境变量

>>> a=os.environ
>>> type(a)

>>>

os.path.abspath(“relative path”):relative->absolute
os.path.splite():分开路径和文件名
os.path.dirname(“path”)
os.path.basename(“path”)

os.path.exists(“path”):判断文件是否存在
os.path.isabs(“path”)
os.path.isfile(“path”)
os.path.isdir(“path”)
os.path.join([a,b])
os.path.getatime(“path”):上一次访问时间
os.path.getmtime(“path”):上一次修改时间

sys模块

sys模块是与python解释器进行交互

sys.argv:获取python运行时候的传入参数

import sys
print(sys.argv)

###################################

E:\>python test.py arg01 arg02 arg03
['test.py', 'arg01', 'arg02', 'arg03']

sys.path:模块的搜索路径
sys.platform

hashlib模块

用于加密的模块

MD5加密

>>> import hashlib
>>>
>>> m = hashlib.md5()
>>> print(m)

>>> m.update("hello world".encode("utf-8"))
>>> print(m.hexdigest())
5eb63bbbe01eeed093cb22bb8f5acdc3
>>>

sha1\sha224\sha256\sha384\sha512加密

logging模块

critical > error > warning > info > debug

logging.basicConfig(
					level=loggin.DEBUG,
					format='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s',
					datefmt='%a,%d %b %Y %H:%M:%S',
					filename='/tmp/test.log',
					filemode='w'
					)

filemode: 默认‘a’追加 / ‘w’

模块级别的函数

>>> logger = logging.getLogger()
>>> fh = logging.FileHandler("test.log")
>>> ch = logging.StreamHandler()
>>> formatter = logging.Formatter("%(asctime)s %(message)s")
>>> fh.setFormatter(formatter)
>>> ch.setFormatter(formatter)
>>> logger.addHandler(fh)
>>> logger.addHandler(ch)
>>> logger.debug("hello world")
>>> logger.critical("hello world")
2018-10-16 20:03:53,645 hello world
2018-10-16 20:03:53,645 hello world
>>> logger.setLevel(logging.DEBUG)
>>> logger.debug("hello world")
2018-10-16 20:05:11,174 hello world
2018-10-16 20:05:11,174 hello world
>>> type(logger)

>>> type(fh)

>>> type(ch)

>>>

configparser模块

>>> import configparser
>>> config = configparser.ConfigParser()
>>> config["item01"]={'name':'tonkia','age':22}
>>> config["item02"]={'name':'tom','age':18}
>>> with open("example.ini","w") as configfile:
...     config.write(configfile)
...
>>>

>>> config = configparser.ConfigParser()
>>> config.read("example.ini")
['example.ini']
>>> print(config.sections())
['item01', 'item02']
>>>

Python 运算符重载
Python 运算符重载
Python 运算符重载
Python 运算符重载
Python 运算符重载

正则表达式

完全匹配
模糊匹配:正则表达式

正则表达式:小型、高度专业化的编程语言。

字符匹配

元字符
通配符 .
尖角符 ^ 开始
$ 结束
* 重复匹配 [0,正无穷]
+ [1,正无穷]
? [0,1]
{n} 指定个数
{x,y} x-y次 默认贪婪匹配 按最大次数的匹配 后面加? 变为惰性匹配
{x,} = [x,正无穷]
[] 字符集
[a-z]
[] 取消元字符的特殊功能(\ ^取反 - 除外)
\ 反斜杠后面接元字符去除特殊功能,接普通字符实现特殊功能(\d 数字 \D非数字 \s空白字符 \S非空白字符 \w 数字字母字符 \W非数字字母字符 \b单词边界 )
() 分组

re.findall()
re.search()
re.split()
re.sub()
re.compile()

序列化

把对象从内存中变成可存储和传输的过程称之为序列化

str&eval

p = str([...])
f = open("xxx","w")
f.write(p)
f.close()
##############################
f = open("xxx","r")
data = f.read()
list = eval(data)
f.close()

JSON

dumps是将dict转化成str格式,loads是将str转化成dict格式。
dump和load也是类似的功能,只是与文件操作结合起来了。

import json

# list = ["aaaaaa","bbbbbbb","ccccccc","ddddddd"]
# data = json.dumps(list)
# print(data)


data = "['aaaaaa','bbbbbbb','ccccccc','ddddddd']"
list = json.loads(data)
print(list[2])

Pickle

Shelve

只有一个open函数,返回类似于字典的对象。

XML

import xml.etree.ElementTree as ET
tree = ET.parse("xxxxxx")
root = tree.getroot()

类成员

  • 字段:普通字段(保存在对象中,只能通过对象访问)、静态字段(存储在类中)
  • 方法:普通方法(保存在对象中)、静态方法(@staticmethod)
  • 类方法:@classmethod
name = "tonkia"
class Person:
    def speak(self):
        print("my name is", name)

    @staticmethod
    def staticmd():
        print("hello")

    @classmethod
    def classmd(cls):
        print(cls)


p = Person()
# p.speak()
Person.speak(p)
Person.staticmd()
Person.classmd()

####################################
my name is tonkia
hello

  • 属性/特性:@property
####################################  方法一
class Bar:
    def __init__(self):
        self.ll = []

    @property
    def getlist(self):
        return self.ll

    @getlist.setter
    def getlist(self, name):
        self.ll.append(name)

    @getlist.deleter
    def getlist(self):
        self.ll.clear()


b = Bar()

print(b.getlist)
b.getlist = "tonkia"
b.getlist = "nike"
b.getlist = "doge"
print(b.getlist)

####################################  方法二
class Bar:
    def __init__(self):
        self.ll = []

    def f1(self):
        return self.ll

    def f2(self, name):
        self.ll.append(name)

    def f3(self):
        self.ll.clear()


    getlist = property(fget=f1, fset=f2, fdel=f3)

b = Bar()

print(b.getlist)
print(type(b.getlist))
b.getlist = "tonkia"
b.getlist = "nike"
b.getlist = "doge"
print(b.getlist)

成员修饰符

共有成员
私有成员

特殊成员

__init__()
__call__()
__int__()
__str__()
__add__() #符号重载
__del__() #析构方法

__dict__()
__getitem__()
__setitem__()
__delitem__()

class Foo:
    def __getitem__(self, item):
        print(item,type(item))

f = Foo()
f[0]
f['name']
f[0:8:2]

############################################

0 
name 
slice(0, 8, 2) 

__iter__()
如果类中有__iter__() 方法,则该对象是可迭代对象
__iter__() 方法返回的是迭代器

metaclass

类都是type类的对象

class Foo:
	def func(self):
		pass
#############################
def func(self):
	pass
Foo = type('Foo',(object,),{'func':func})

创建自己的type类

class MyType(type):
	def __init__(self,*args,**kwargs)
		print("mytype")

class Foo(object,metaclass=MyType):
	def __init__(self):
		pass

Python学习_第4张图片

class MyType(type):
    def __init__(self, *args, **kwargs):
        print("创建一个类的对象 加载class的时候 Foo就是一个MyType对象")
        print(self.__dict__)

    def __call__(self, *args, **kwargs):
        print("用类创建对象 用Foo()创建对象的时候调用")
        print(self.__dict__)
        # obj = "hello world"
        # self.__init__(obj)
        # return obj


class Foo(metaclass=MyType):
    def __init__(self):
        print("init 还执行么?")


print(type(Foo))
f = Foo()
print(type(f))
print(type(None))

异常处理

try:
    raise Exception("主动抛出异常")
except Exception as e:
    # 异常处理
    pass
else:
    # 未抛出异常执行
    pass
finally:
    pass

断言 assert

反射

hasattr(obj,attr)
getattr(obj,attr)
setattr(obj,attr,val)
delattr(obj,attr)

单例模式

class Foo:
	__v = None
	
	@classmethod
	def get_instance(cls):
		if cls.__v:
			return cls.__v
		else
			cls.__v = Foo()
			return cls.__v

网络通信要素

IP地址
端口号
传输协议 TCP、UDP

socket()函数

Python 中,我们用 socket()函数来创建套接字,语法格式如下:

socket.socket([family[, type[, proto]]])
  • family:套接字家族可以使AF_UNIX或者AF_INET
  • type:套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
  • protocol:一般不填默认为0

你可能感兴趣的:(Python)