编译型和解释型(Java属于混合型)
动态语言和静态语言
强类型和弱类型
Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。
Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。
变量名 | 描述 |
---|---|
PYTHONPATH | PYTHONPATH是Python搜索路径,默认我们import的模块都会从PYTHONPATH里面寻找。 |
PYTHONSTARTUP | Python启动后,先寻找PYTHONSTARTUP环境变量,然后执行此变量指定的文件中的代码。 |
PYTHONCASEOK | 加入PYTHONCASEOK的环境变量, 就会使python导入模块的时候不区分大小写。 |
PYTHONHOME | 另一种模块搜索路径。它通常内嵌于的PYTHONSTARTUP或PYTHONPATH目录中,使得两个模块库更容易切换。 |
默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。
保留字即关键字,我们不能把它们用作任何标识符名称。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']
在 python 用 import 或者 from…import 来导入相应的模块。
Python3 中有六个标准的数据类型:
Python3 的六个标准数据类型中:
不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
多个变量赋值
Python允许你同时为多个变量赋值。例如:
a = b = c = 1
也可以为多个对象指定多个变量。例如:
a, b, c = 1, 2, "tonkia"
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会把整型转换成为浮点数。
Python中的字符串用单引号 ’ 或双引号 " 括起来,同时使用反斜杠 \ 转义特殊字符。
字符串的截取的语法格式如下:
变量[头下标:尾下标]
加号 + 是字符串的连接符, 星号 * 表示复制当前字符串,紧跟的数字为复制的次数。
Python 没有单独的字符类型,一个字符就是长度为1的字符串。
1、反斜杠可以用来转义,使用r可以让反斜杠不发生转义。
2、字符串可以用+运算符连接在一起,用*运算符重复。
3、Python中的字符串有两种索引方式,从左往右以0开始,从右往左以-1开始。
4、Python中的字符串不能改变。
List(列表) 是 Python 中使用最频繁的数据类型。
列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)。
列表是写在方括号 [] 之间、用逗号分隔开的元素列表。
和字符串一样,列表同样可以被索引和截取,列表被截取后返回一个包含所需元素的新列表。
列表截取的语法格式如下:
变量[头下标:尾下标]
加号 + 是列表连接运算符,星号 * 是重复操作。
与Python字符串不一样的是,列表中的元素是可以改变的
1、List写在方括号之间,元素用逗号隔开。
2、和字符串一样,list可以被索引和切片。
3、List可以使用+操作符进行拼接。
4、List中的元素是可以改变的。
元组(tuple)与列表类似,不同之处在于元组的元素不能修改。元组写在小括号 () 里,元素之间用逗号隔开。
元组中的元素类型也可以不相同。
string、list和tuple都属于sequence(序列)。
1、与字符串一样,元组的元素不能修改。
2、元组也可以被索引和切片,方法一样。
3、注意构造包含0或1个元素的元组的特殊语法规则。
4、元组也可以使用+操作符进行拼接。
集合(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)是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、创建空字典使用 { }。
有时候,我们需要对数据内置的类型进行转换,数据类型的转换,你只需要将数据类型作为函数名即可。
以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。
函数 | 描述 |
---|---|
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) | 将一个整数转换为一个八进制字符串 |
算符 | 描述 |
---|---|
% | 取模 |
** | 幂 |
// | 取整除 |
算符 | 描述 |
---|---|
& | 按位与运算符 |
| | 按位或运算符 |
^ | 按位异或运算符 |
~ | 按位取反运算符 |
<< | 左移动运算符 |
>> | 右移动运算符 |
and
or
not
除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。
算符 | 描述 |
---|---|
in | 如果在指定的序列中找到值返回True,否则返回False |
not in | 如果在指定的序列中没有找到值返回True,否则返回False |
身份运算符用于比较两个对象的存储单元
算符 | 描述 | 实例 |
---|---|---|
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() #浅拷贝
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
>>>
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
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
一个.py文件就是一个模块
python标准库
第三方模块
应用程序自定义模块
在 python 用 import 或者 from…import 来导入相应的模块。
>>> 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.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() # [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.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模块是与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
用于加密的模块
MD5加密
>>> import hashlib
>>>
>>> m = hashlib.md5()
>>> print(m)
>>> m.update("hello world".encode("utf-8"))
>>> print(m.hexdigest())
5eb63bbbe01eeed093cb22bb8f5acdc3
>>>
sha1\sha224\sha256\sha384\sha512加密
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)
>>>
写
>>> 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()
把对象从内存中变成可存储和传输的过程称之为序列化
p = str([...])
f = open("xxx","w")
f.write(p)
f.close()
##############################
f = open("xxx","r")
data = f.read()
list = eval(data)
f.close()
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])
只有一个open函数,返回类似于字典的对象。
import xml.etree.ElementTree as ET
tree = ET.parse("xxxxxx")
root = tree.getroot()
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
#################################### 方法一
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__() 方法返回的是迭代器
类都是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
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
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
Python 中,我们用 socket()函数来创建套接字,语法格式如下:
socket.socket([family[, type[, proto]]])