python3
---------------------------------------------------------------------------------------------------------------------------------
进制表示
二进制 0b100 bin()
八进制 0o4 oct()
十进制 4 int()
十六进制 0x4 hex()
---------------------------------------------------------------------------------------------------------------------------------
表示字符串有 单引号、双引号、三引号
特殊点:
1、双引号在字符串最外围时,单引号在里面作为字符出现
2、三引号在IDLE中可以回车多行输出
---------------------------------------------------------------------------------------------------------------------------------
原始字符串
---------------------------------------------------------------------------------------------------------------------------------
字符串切割
---------------------------------------------------------------------------------------------------------------------------------
列表 type([1]) ———》 list
嵌套列表
元组(不可变) type((1)) ———》 int
type((1,)) ———》 tuple
str list tuple
序列
'hello world'[2] 'l'
[1,2,3,4][2] '3'
(1,2,3,4)[2] '3'
"0123456789"[0:8:2] '0246'
3 in [1,2,3,4,5,6,7,8] True
3 not in [1,2,3,4,5] False
len([1,2,3,4,5,6]) 6
len("hello world") 11
max([1,2,3,4,5,6,8]) 8
max(['hello world']) w
ord('w') 119 表示ascII码值
---------------------------------------------------------------------------------------------------------------------------------
集合 set
1、无序
2、不重复
len({1,2,3}) 3
1 in {1,2,3} True
{1,2,3,4,5,6}-{3,4,9} {1,2,5,6} 差集
{1,2,3,4,5,6}&{3,4,9} {3,4} 交集
{1,2,3,4,5,6} | {3,4,9} {1,2,3,4,5,6,9} 合集或者并集
type({}) <class 'dict'>
type(set()) <class 'set'>
---------------------------------------------------------------------------------------------------------------------------------
字典
无序
{key1:value1,key2:value2....}
type({1:1,2:2,3:3}) dict
value :str、int、float、list、set、dict
key:(不可变) 不能是list、set
type({}) dict
---------------------------------------------------------------------------------------------------------------------------------
int、str、tuple 值类型 (不可变)
list、set、dict 引用类型 (可变)
---------------------------------------------------------------------------------------------------------------------------------
python项目的组织结构
包
模块
类
函数、变量
---------------------------------------------------------------------------------------------------------------------------------
导入
1、模块(import)(单单import只能导入模块,形式说明而已) (本模块和testPackage是同一级别的目录)
import testPackage.mode1 as b
print(b.a) #print(testPackage.mode1.a)
(导入testPackage包里的模块mode1,并命名别名为b)
2、变量 (from导入模块,import导入变量)(本模块和testPackage是同一级别的目录)
(用from导入只能用一下六种方式)(from 可以导入包里的模块、模块里的变量)
方式1、from testPackage.mode1 import (variable1,variable2,variable3) (最好不要用反斜杆换行,可以用括号括住)
方式2、from testPackage.mode1 import variable1,variable2,variable3
方式3、from testPackage.mode1 import *
print(variable1) 可以直接打出 (这里就不能使用print(mpde1.variable),会报错)
导入testPackage包里的模块mode1里所有变量
(或者是方式4 from testPackage import mode1 as variable1)(输出: print(variable1.variable1) 一样是没问题的 )
(说明以上一行:若当import一个模块后加命名,只能用命名后的名称)
方式5 from testPackage import mode1
方式6 from testPackage import *
---------------------------------------------------------------------------------------------------------------------------------单独导入一个包
import bao
本模块和包bao是用一级目录
(只会运行包里的__init__.py文件,包里的其他的模块使用不了)
---------------------------------------------------------------------------------------------------------------------------------
在需要导入模块(或者包的__init__.py 文件里)里编写 __all__=["变量1","变量2"],
则在from testPackage.mode1 import *后只能使用mode1里的变量1和变量2
---------------------------------------------------------------------------------------------------------------------------------
再倒入某个包里某个模块等,都是先运行包里的__init__.py文件
如果包里的__init__.py文件里的编写:__all__=["模块1","模块2"]
则使能使用 from testPackage import * ,是只会运行__init__.py、模块1、模块2,也是说不能引用包里的模块3和其他(模块4。。。)
------------------------------------------------------------------------------------------------------
参数:
1、必须参数
2、关键字参数
3、默认参数
4、可变参数
可变参数
def class2(*param): print("参数:",param) print("类型",type(param)) print("class(1,2,3): ",class2(1,2,3)) print("class([1,2,3]): ",class2([1,2,3])) print("class((1,2,3)): ",class2((1,2,3))) print("clase({1,2,3}): ",class2({1,2,3})) print("class(*(1,2,3)): ",class2(*(1,2,3))) print("class(*[1,2,3]): ",class2(*[1,2,3])) print("class(*{1,2,3}): ",class2(*{1,2,3}))
输出如下参数: (1, 2, 3)
类型 <class 'tuple'>
class(1,2,3): None
参数: ([1, 2, 3],)
类型 <class 'tuple'>
class([1,2,3]): None
参数: ((1, 2, 3),)
类型 <class 'tuple'>
class((1,2,3)): None
参数: ({1, 2, 3},)
类型 <class 'tuple'>
clase({1,2,3}): None
参数: (1, 2, 3)
类型 <class 'tuple'>
class(*(1,2,3)): None
参数: (1, 2, 3)
类型 <class 'tuple'>
class(*[1,2,3]): None
参数: (1, 2, 3)
类型 <class 'tuple'>
class(*{1,2,3}): None
---------------------------------------------------------------------------------------------------------------------
关键字参数
def city_temp(**param): print(param) print(type(param)) city_temp(bj='32c',xm='23c',sh='31c')
输出:{'bj': '32c', 'xm': '23c', 'sh': '31c'}
<class 'dict'>
---------------------------------------------------------------------------------------------------
def city_temp(**param): for key,value in param.items(): print(key,':',value) a = {'bj':'32c','sh':'31c'} city_temp(**a)
输出:
bj : 32c
sh : 31c
---------------------------------------------------------------------------------------------------------------------------------
python里面没有块级作用域的概念
即for循环外面可以使用里面的变量
# c = 10 #全局变量 def demo(): c = 50 #局部变量 for i in range(0,9): a = 'a' c +=1 print(c) print(a) #print(c) demo()、
依然可以打印出a的值
---------------------------------------------------------------------------------------------------------------------------------
将函数里的变量定义成全局变量(模块变量)(即可在别的模块里引用(import进去就行了))
def demo(): global c c = 1 demo() print(c)---------------------------------------------------------------------------------------------------------------------------------
类:
访问实例变量需要加self关键字
---------------------------------------------------------------------------------------------------------------------------------
在实例方法中访问类变量sum
__class__.sum
或者在类方法中调用 如下
---------------------------------------------------------------------------------------------------------------------------------
类方法
方法前夹@classmethid关键字】
class Student(): @classmethod def plus_sum(cls): cls.sum +=1 print(cls.sum)
使用该法方法最好直接用Student.plus_sum()才能更好说明使用类方法
但也可以student1 =Student() student1.plus_sum()
python不会报错
--------------------------------------------------------------------------------------------------------------------------------
静态方法
调加装饰器@staticmethod
class Student(): @staticmethod def add(x,y): print('This is a static method') student1 = Student() student1.add(1,2) Student.add(2,3)
对象可以使用静态方法
类也可以使用静态方法
静态方法也可以访问类变量:静态方法里面直接print(Student.name)
静态方法不能访问实例变量
能使用静态方法的地方可以使用类方法替代
建议少用静态方法,因为静态方法和面对对象关联比较弱。
放回类型是Nonetype
---------------------------------------------------------------------------------------------------------------------------------
成员可见性:公开和私有
将类里面的实例方法、实例变量、类方法、类变量、、、、、变成私有的,在其前面加双下滑线。
若在其前面加双下划线且在后面也加双下划线,则其为公开,非私有
__score是私有变量
输出实例里面的变量 print(student1.__dict__)
会看到私有变量的名字被改成了 __Student__score
但是如果
student1.__socre = -1
print(student1.__socre)
python不会报错
原因是这里 对象student1,新增了一个公开变量__socre(在查看该实例里有什么变量(即用student1.__dict__查看),可看到)
严格意义上,python里面是没有私有变量的!你明白的。想要访问私有变量,在外面一样是可以访问的
---------------------------------------------------------------------------------------------------------------------------------
类的单继承
mode1.py里面
class Human(): sum = 0 def __init__(self,name,age): self.name = name self.age = age self.__score = 0 self.__class__.sum +=1 def get_name(self): print(self.name) def meiziya(self): print('this is Human meiziya')
mode2.py里面
from mode1 import Human class Student(Human): def __init__(self,school,name,age): self.school = school Human.__init__(self,name,age) ###重点 def do_homework(self): print('english homework') def meiziya(self): Human.meiziya(self) print('this is Student meiziya ') student1 = Student('路边小学','小明',18) print(student1.sum) print(Student.sum) print(student1.name) print(student1.age) student1.get_name() student1.meiziya()
输出:
1
1
小明
18
小明
this is Human meiziya
this is Student meiziya
函数重载——》先运行最里面的类的函数,再逐步往外
super关键字
在上上面的mode2里的Student里面调用父类的构造函数可这样用
super(Student,self).__init__(name,age) 即可
调用父类的实例方法一样是可以用super关键字
super(Student,self).meiziya() 即可
则在修改要继承的类时,只需在子类括号里修改,其余地方不需要
---------------------------------------------------------------------------------------------------------------------------------
正则表达式:
import re
取反 (中间字符不为c、f、d) r = re.findall('a[^cfd]c',s)
# 数字 \d \D
#单词 \w \W
#空白字符 \s \S
#匹配0次或者无限次 *
#匹配1次或者无限次 +
#匹配0次或者1次 ?
非贪婪:
r = re.findall('[a-z]{3,6}?',a)
最多匹配三个单词的字符
#边界匹配
r = re.findall('^\d{4,8}$',qq)
#组
一个括号就是一组,括号后面接{3},表重复该str三次
sub()函数 (替代)
r = re.sub('C#','GO',lanuage,1)
第一个参数是要搜索的str,第二个参数要替换的str,第三个参数,操作的str,第四个参数是要替换的次数,默认为0全部
第二个参数可以为函数
import re lanuage = 'PythonC#JavaC#PHPC#' def covert(value): print(value.group()) print(type(value.group())) match = value.group() return '!!' + match + '!!' r = re.sub('C#',covert,lanuage) print(r)
re.match() 只能从字符串的首位开始匹配,只匹配一次,也就是只返回一次
re.search() 开始位无限制,也只匹配一次,
re.findall() 开始位无限制,匹配所有
match()函数
s = '8d83c773dDGS' r = re.match('\d',s) print(r) #如果无法匹配到在位None,None.span()和None.group()都是会报错的 print(r.span()) print(r.group()) r1 = re.search('\d',s) print(r1.group())
输出
<_sre.SRE_Match object; span=(0, 1), match='8'>
(0, 1)
8
8
re.search()函数
import re s = 'life is short,i use python, i love python' r = re.search('life(.*)python(.*)python',s) print(r.group(0)) print(r.group(1)) print(r.group(2))
---------------------------------------------------------------------------------------------------------------------------------
JSON
一种轻量级的数据交换格式
Json object-> dict
import json json_str = '{"name":"zhimin","age":18}' #JSON object (array) student = json.loads(json_str) print(type(student)) print(student)
输出:<class 'dict'>
{'name': 'zhimin', 'age': 18}
Json 数组array -> list(反序列化)
import json json_str = '[{"name":"zhimin","age":18},{"name":"zhimin","age":18}]' student = json.loads(json_str) print(type(student)) print(student)
输出:(反序列化)
<class 'list'>
[{'name': 'zhimin', 'age': 18}, {'name': 'zhimin', 'age': 18}]
格式对应表
json python object dict array list string str number int true True false False null None
python list -> json array(序列化)
import json student = [ {'name':'zhimin','age':18,'flag':False}, {'name':'zhimin','age':19} ] json_str = json.dumps(student) print(type(json_str)) print(json_str)
输出:(序列化)
<class 'str'>
[{"name": "zhimin", "age": 18, "flag": false}, {"name": "zhimin", "age": 19}]
JSON对象 python里应该说是没有这个说法
JSON 数据交换的一种格式
JSON字符串
JSON有自己的数据格式,虽然它和Javascript的数据类型有些相似
ECMASCRIPT ActionScript JSON Typescript
REST服务的标准格式:JSON
---------------------------------------------------------------------------------------------------------------------------------
python里面一切都是python类或者对象
---------------------------------------------------------------------------------------------------------------------------------
枚举
from enum import Enum class VIP(Enum): YELLOW = 1 GREEN = 2 BLACK = 3 RED = 4 print(VIP.YELLOW.value) print(VIP.YELLOW) print(type(VIP.YELLOW)) print(VIP.YELLOW.name) print(type(VIP.YELLOW.name)) print(VIP['YELLOW']) print(type(VIP['YELLOW']))
输出:
1VIP.YELLOW<enum 'VIP'>YELLOW<class 'str'>VIP.YELLOW<enum 'VIP'>
(除枚举外表示类型有种形式:1、模块变量;2、字典;3、类)
上面这三种都是可变的,且没有防止相同标签的功能
枚举特点:1、不能改变标签的值;2、防止出现相同标签
遍历枚举的变迁
for v in VIP:
print(v)
枚举的比较
同一个枚举:
result = VIP.GREEN == VIP.GREEN
print(result) 打印输出:True
result1 = VIP.GREEN is VIP.GREEN
print(result) 打印输出:True
两个枚举:
result = VIP.GEEN == VIP.GREEN #他们的值是相同的
print(result) 打印输出:False
枚举的注意问题:
两个标签的值都是一样时,则第二个标签位第一个标签的别名,prin(第二个标签) 输出第一个标签的名
枚举的遍历:
from enum import Enum class VIP(Enum): YELLOW = 1 GREEN = 1 BLACK = 3 RED = 4 for v in VIP.__members__.items(): print(v) print(type(v))('YELLOW', <VIP.YELLOW: 1>)
<class 'tuple'>
('GREEN', <VIP.YELLOW: 1>)
<class 'tuple'>
('BLACK', <VIP.BLACK: 3>)
<class 'tuple'>
('RED', <VIP.RED: 4>)
<class 'tuple'>
对于上面的,如果for v in VIP.__members__: print(v) 则输出的YELLOW YELLOW BLACK RED
枚举的转换:
a = 1 print(VIP(a))
输出:VIP.YELLOW
枚举的总结:
枚举:23种设计模式中的单例模式,不能像类一样实例化
强制每个枚举的数值都是int类型,则可以 from enum import IntEnum
每个枚举的值都是不重复的的可以用 装饰器unique
from enum import IntEnum,unique @unique class VIP(IntEnum): YELLOW = 1 GREEN = 2 BLACK = 3 RED = 4---------------------------------------------------------------------------------------------------------------------------------