Python
Python教程1
official::Python教程
反编译
text::数据结构与算法
〇、基本概念
静态语言 编译 先编译再执行 例:C
脚本语言 解释 边编译边执行 例:python
1 pyCharm
设置中文:File——Setting——Plugins——Chinese (Simplified) Language Pack
pyCharm快速添加引号: 1. ctrl + r 2. 上方填入(.*?):(.*),选择正则表达式 3. 下方填入'$1':'$2'
2 类型
不可变数据类型:Number、String、Tuple。
可变数据类型:List、Dictionary、Set。
可变数据类型在值变化后地址不会改变。不可变数据类型在值变化后会重新开辟空间并修改地址。
3 常见语句
print:使用 参数设置
pass / …的用法
todo:待做。pyCharm中点击下方todo可以看到所有todo。
''' 输出 格式:print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) objects -- 复数,表示可以一次输出多个对象。输出多个对象时,需要用 , 分隔。 sep -- 用来间隔多个对象,默认值是一个空格。 end -- 用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符串。 file -- 要写入的文件对象。 flush -- 输出是否被缓存通常决定于 file,但如果 flush 关键字参数为 True,流会被强制刷新。 输出百分号的方法:%% ''' print (1 )input ()eval ('str' )del variable[index]__init__ __doc__ match num: case 1 : case 2 : case _: print ( val := function() , val ** 2 )if (length := len (string)) > 10 : pass
4 常用函数 isinstance (a,int )isinstance (a,str )isinstance (a,(str ,int ,list )) quotient , remainder = divmod ( dividend , divisor ) ord ('A' )chr (65 )
5 内存 lst1 = [2 ,3 ] lst2 = [1 ,4 ,5 ,2 ] print (id (lst1[0 ]) == id (lst2[3 ]))
二、字符串 1 普通函数
字符串函数 格式化输出
str .format (args)s.split(sep,[ num ]) s.strip(["str" ]) s.lstrip(["str" ]) s.rstrip(["str" ]) "" .join(seq)s.isdigit() : s.count("str" ) s.index("str" ) s.replace(old, new[, max ]) s = s[::]
2 字符串前的符号 u"str" r"str" b"str" f"str" lst= [1 ,2 ,3 ] print (lst, f'has a length of {len (lst)} .' )
三、列表与元组 1 列表
普通函数
浅拷贝和深拷贝
list ()a = b a = b.copy() a = b.deepcopy() del (lst[index])lst.append(x) lst.extend(lst) lst.pop([index]) lst.sort(reverse=False ) lst.reverse() lst.count(val)
lst.sort(key=lambda x:x[0 ])
2 元组
元素不可被修改(列表可以用extend扩展)的列表(只可拼接):tuple()
括号可以省略。
当元组中只有一个元素时,逗号不可省略。( tup = (1,) )
map()
zip()
enumerate()
map ()map (iter ,type )map (list ,int )zip ()zip (iter [,iter ...])zip (a,b)for idx,num in enumerate (lst): print (idx,num) * + 可迭代对象 *zip (lst) def is_value_in_nested_tuple (value, nested_tuple ): for item in nested_tuple: if isinstance (item, tuple ): if is_value_in_nested_tuple(value, item): return True elif item == value: return True return False
四、字典与集合 1 字典
键值对,dict()
Counter()
dic.keys() dic.values() dic.items() dic.get(key,default) dic.pop(key,default) dic.popitem() dic.clear() dic.copy()/.deepcopy() dic.update(dicts2) dic.get(key, default=None ) key in dicts
dic2 = {value: key for key, value in dic1.items()} max ( dic ) max ( dic.values() )dic[ max (dic) ] max ( dic, key=dic.get)max ( dic,key=lambda x:len (dic[x])) lst = [ [ key,value ] , ... ] dic = dict ( lst ) *dic **dic
from collections import Countera = Counter() b = Counter('chenkc' ) c = Counter({'a' :1 , 'b' :2 , 'c' :3 }) d = Counter(a = 1 , b = 2 , c = 3 ) dic = collections.defaultdict(list ) collections.deque()
2 集合
数学集合,set()
S.discard(x) S.remove(x) S.isdisjoint(T) res = set1 & set2 res = set1.intersection(set2) res = set1 | set2 res set1.union(set2) res = set1 - set2 res = set1.difference(set2) res = set1 ^ set2 res = set1.symmetric_difference(set2) subset_check = set1 in set2 subset_check = set1.issubset(set2) superset_check = set2 in set1 superset_check = set1.issuperset(set2)
五、函数 1 变量范围 a = 10 def func (): global a a = 15 func() print (a) def outer (): x = 10 def inner (): nonlocal x x = 20 inner() print (x) outer()
2 自定义函数
函数参数:args
字符串方式访问函数
def funcname (paras:types)->types : statements [return [expression]] def func (): def new_func (): pass new_func() def test (a,b )test (1 ,2 ) def test (a,b )test (b=1 ,a=2 ) def test (a,b=2 )test (1 ) def test ( name, *args , **kwargs ): pass eval ( str )()
def fun (a=( ),b=[] ): a += (1 ,) b.append(1 ) return a,b fun() print (fun())''' 输出:((1,), [1, 1]) Python的默认参数只在函数定义时被赋值一次,而不会每次调用函数时又创建新的引用。 元组不可修改 所以调用了两次函数,第二次元组初始也是空元组,所以只有一个元素。 ''' def fn (): t = [] i = 0 while i < 2 : t.append(lambda x: print (i*x,end="," )) i += 1 return t for f in fn(): f(2 ) ''' 输出:4,4, 因为在for的时候fn中的循环先被执行完了,此时i = 2,然后再调用print函数。 '''
3 yield
yield 的作用就是把一个函数变成一个 generator。
在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值。
def jie (now ): count = 1 for i in range (1 , now + 1 ): count *= i yield i yield count jar = jie(10 ) for i in jar : print ("{}:" .format (i), end = "" ) i = jar.__next__() print ("{}" .format (i))
4 匿名函数 lambda parameters : expression
cnt = Counter(barcodes) barcodes.sort(key=lambda x: (-cnt[x], x))
5 常用函数
any() all()
abs (num)round (num)quotient,remainder = divmod ( dividend , divisor )
int (str , base=10 ) hex () bin () chr () ord ()
any (iter )all (iter )filter (function,iter )reduce(function,iter [,init])
6 装饰器
装饰器
多个装饰器从下往上调用。
定义:在函数调用前先调用闭包的函数,参数传递是传给是闭包的函数。
@cache 装饰器 :一种装饰在被执行的函数上,将其执行的结果缓存起来的缓存装饰器。当下次请求的时候,如果请求该函数的传参未变则直接返回缓存起来的结果而不再执行函数。
@property :装饰函数后,该函数会变成属性且变为只读,使用时不用带括号,函数没有参数。
def Do_Add (ad ): def Add (a,b ): print ("hello" ) c = ad(a,b) print ("value:%d" %c) return Add def ad (a,b ): c = a + b return c myfunc = Do_Add(ad) myfunc(5 ,6 ) @Do_Add def ad (a,b ): c = a + b return c ad(1 ,2 )
def get_func_name (func ): def wrapper (*args, **kwargs ): print (f"Calling function: {func.__name__} " ) result = func(*args, **kwargs) return result return wrapper @get_func_name def add (a, b ): print (a + b) add(1 , 2 ) def log_decorator (log_level='INFO' ): def decorator (func ): def wrapper (*args, **kwargs ): print (f"{log_level} : Entering function {func.__name__} ()" ) result = func(*args, **kwargs) print ("result:" ,end=" " ) print (result) print (f"{log_level} : Exiting function {func.__name__} ()" ) return result return wrapper return decorator @log_decorator(log_level='INFO' ) def multiply (a, b ): print (1 ) return a * b multiply(5 , 4 )
@property def name (self ): return self._name @name.setter def name (self, value ): self._name = value
六、类与对象 1 定义
变量:
类变量可以通过类名加变量名访问,也可以通过对象名加变量名访问。在实例化对象后,若类变量没有修改过值,通过类名加变量名修改类变量值将会同时作用于类和对象。若类变量修改过值,类变量相当于变成了实例变量,通过类名加变量名的方式将不会再修改对象类变量值。后续实例化对象后实例出的类变量值则是实例化最新的变量值。
方法:
成员方法:带参self,可以访问类变量和成员变量,可以用对象名访问。
普通方法:任意参,可以访问类变量和成员变量,可以用对象名和类名访问。
类方法:类方法装饰器@classmethod
,参数cls,可以访问类变量,可以用对象名和类名访问。
静态方法:静态方法装饰器@staticmethod
,无参,不可以访问类变量和成员变量,可以用对象名和类名访问。
class MyClass : class_var = "This is a class variable" def __init__ (self, instance_var ): self.instance_var = instance_var def common_method (): print ("This is an common method" ) def instance_method (self ): print ("This is an instance method" ) print ("Accessing instance variable:" , self.instance_var) print ("Accessing class variable:" , self.class_var) @classmethod def class_method (cls ): print ("This is a class method" ) print ("Accessing class variable:" , cls.class_var) @staticmethod def static_method (): print ("This is a static method" ) class Base (object ): count = 0 def __init__ (self ): pass b1 = Base() b2 = Base() b1.count = b1.count + 200 print (b1.count," " ,Base.count," " ,b2.count)Base.count = Base.count + 5 print (b1.count," " ,Base.count," " ,b2.count)b2.count = b2.count + 100 print (b1.count," " ,Base.count," " ,b2.count)Base.count = Base.count + 50 print (b1.count," " ,Base.count," " ,b2.count)b3 = Base() print (b1.count," " ,Base.count," " ,b2.count," " ,b3.count)
2 方法参数
对象:self
类:cls的使用
私有参数:__name
class Dog : def __init__ (self ): self.age = 6 def my_print (self ): print (self.age) class MyClass : def __init__ (self, name ): self.name = name @classmethod def create (cls, name ): obj = cls(name) return obj def display (self ): print ("Name:" , self.name) my_obj = MyClass.create("Alice" ) my_obj.display() class NewClass : def __init__ (self ): self.__name = "1" new = NewClass() print (new._NewClass__name)
3 高级特效
继承的规则:如果有单个父类,则直接继承;如果有多个父类,则按照顺序从左到右依次继承
所有的类默认继承object类,object是python中所有类的基类
super().father_function()
调用父类方法
方法重写:子类重写和父类同名同参的方法后,系统在调用时将调用子类重写后的方法
class Animal : def __init__ (self, name ): self.name = name def speak (self ): print (f"{self.name} is making a sound." ) class Dog (Animal ): def __init__ (self, name, breed ): super ().__init__(name) self.breed = breed def speak (self ): print (f"{self.name} is barking." ) animal = Animal("Generic Animal" ) animal.speak() dog = Dog("Buddy" , "Labrador" ) dog.speak()
4 魔法方法
__new__
是一个类级别方法(classmethod),它在对象实例化之前被调用。它负责创建并返回实例对象,在实例化过程中是第一个被调用的方法。它的主要作用是控制对象的创建过程,也就是创建一个空类。
__init__
是一个实例级别方法(instancemethod),它在对象实例化之后被调用。它用于初始化实例的属性,并在对象创建后进行额外的设置,也就是初始化数据。
对于new和init区别:
__new__
是一个静态方法,而__init__
是一个实例方法
__new__
方法会返回一个创建的实例,而__init__
什么都不返回
只有在__new__
返回一个cls的实例时,后面的__init__
才能被调用
当创建一个新实例时调用__new__
,初始化一个实例时用__init__
常用魔术方法
魔术方法名
作用
__new__()
初始化对象
__init__()
初始化对象内容
__del__()
删除对象
__str__()
对象的字符串表示
__repr__()
对象的非正式字符串表示
__len__()
返回对象的长度
__call__()
对象的可调用行为
class MyClass : def __new__ (cls, *args, **kwargs ): print ("Creating instance using __new__" ) instance = super ().__new__(cls) return instance def __init__ (self, value ): print ("Initializing instance using __init__" ) self.value = value obj = MyClass(10 )
5 重载
类的重载:overload
@typing.overload __init__(): @overload def func (): __add__ __sub__ __mul__ __div__ __mod__ __repr__、__str__ __getitem__ __setitem__ __delitem__ __contains__ __len__ __eq__、__ne__ __lt__、__le__ __gt__、__ge__ __iter__ __getattr__ __getattribute__
class Vector : def __init__ (self, x, y ): self.x = x self.y = y def __add__ (self, other ): if isinstance (other, Vector): new_x = self.x + other.x new_y = self.y + other.y return Vector(new_x, new_y) else : raise TypeError("Unsupported operand type: {} and {}" .format (type (self), type (other))) def __str__ (self ): return "({}, {})" .format (self.x, self.y) v1 = Vector(1 , 2 ) v2 = Vector(3 , 4 ) result = v1 + v2 print (result)
6 接口
在python中,若函数中存在:raise NotImplementedError("...")
,那么子类必须要继承并重写这个函数。(类似接口、抽象类和抽象方法)
class Father (object ): def f1 (self ): raise NotImplementedError(".f1() must be overridden" ) class Child (Father ): def f1 (self ): print ("Hello World" )
from abc import ABC, abstractmethodclass Shape (ABC ): @abstractmethod def area (self ): pass class Circle (Shape ): def __init__ (self, radius ): self.radius = radius def area (self ): return 3.14 * self.radius * self.radius class Animal (ABC ): @abstractmethod def make_sound (self ): pass class Dog (Animal ): def make_sound (self ): return "汪汪汪" circle = Circle(5 ) print ("圆的面积:" , circle.area()) dog = Dog() print ("狗发出的声音:" , dog.make_sound())
七、存储 1 开关文件 myfile = open ( filename [ , mode ] [ , encoding= ] ) with open () as name ''' r/w/a:读写追加 b:二进制形式 +:以读/写方式打开 ''' myfile.close() myfile.flush()
2 读写数据 read( [ size ] ) readline ( [ size ] ) readlines ( [ hint ] ) readable() write( str ) writelines( seq_of_str ) writable() tell() seek( offset [ , whence ] ) pickle.dump( obj , file ) pickle.load( file )
3 os模块和os.path模块 abspath( path ) dirname( path ) exists( path ) getatime( path ) getmtime( path ) getsize( path ) isabs( path ) isdir( path ) isfile( path ) split( path ) splitext( path ) join( str , ... ) os.getcwd() os.listdir( path ) os.remove( file ) os.removedirs( path ) os.rename( old , new ) os.mkdir( path ) os.stat( path )
4 CSV格式读写数据
5 序列化
序列化:把复杂的数据结构变成一连串的字节
反序列化:把一连串的字节变成复杂的数据结构
import jsonjson.dump( data , fp , ensure_ascii=False ) json.load( fp ) res = json.loads( str ) import pickle
八、异常 1 异常流程 try :except [ ExceptionName ] [ as e ]: except [ ExceptionName ]: else :finally :
2 异常类型
异常名
异常含义
Exception
所有异常
BaseExcpettion
所有异常的根异常
GeneratorExit
由生成器.close()方法引发
KeyboardInterrupt
由键盘中断(通常为Ctrl+C) 生成
SystemExit
程序退出/终止
Exception
所有非退出异常的基类
StopIteration
引发后可停止迭代
StandardError
所有内置异常的基类(仅在Python2中使用)
ArithmeticError
算数异常的基类
FloatingPointError
浮点操作失败
ZeorDivisionError
对0进行除或取模操作
AssertionError
由assert语句引发
AttributeError
当属性名称无效时引发
EnviromentError
发生在Python外部的错误
IOError
I/O或文件相关的错误
OSError
操作系统错误
EOFError
到达文件结尾时引发
ImportError
import语句失败
LookupError
索引和键错误
IndexError
超出序列索引的范围
KeyError
字键盘不存在
MemoryError
内存不足
NameError
无法找到局部或全局名称
UnboundLocalError
未绑定的局部变量
ReferenceError
销毁被引用对象后使用的弱引用
RuntimeError
一般运行时错误
NotImplementedError
没有实现的特性
SystaxError
解析错误
IndentationError
缩进错误
TabError
使用不一致的制表符(由-tt选项生成)
SystemError
解释器中的非致命系统错误
TypeError
给操作传递了错误的类型
ValueError
无效类型
UnicodeError
Unicode错误
UnicodeDecondeError
Unicode解码错误
UnicodeEncodeError
Unicode编码错误
UnicodeTranslateError
Unicode转换错误
Warning
警告的基类
DeprecationWarning
关于被弃用的特征的警告
FutureWarning
关于构造将来语义会有改变的警告
OverflowWarning
旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning
关于特性将会被废弃的警告
RuntimeWarning
可疑的运行时行为(runtime behavior)的警告
SyntaxWarning
可疑的语法的警告
UserWarning
用户代码生成的警告
3 抛出异常 raise [Exception [, args [, traceback]]]
4 断言 assert expression [, arguments]import sysassert ('linux' in sys.platform), "该代码只能在 Linux 下执行" import sysassert ('win32' in sys.platform), "win32"
5 自定义异常 class UserDefinedException (Exception ): def __init__ (self, eid, message ): self.eid = eid self.message = message class ExceptionDemo : def draw (self, number ): print ("called compute(" + str (number) + ")" ) if number > 500 or number <= 0 : raise UserDefinedException(101 , "number out of bounds" ) else : print ("normal exit" ) myobject = ExceptionDemo() try : myobject.draw(125 ) myobject.draw(900 ) except UserDefinedException as e : print ("Exception caught,id:{},message:{}" .format (e.eid, e.message))
九、导入包 1 包定义
包中含有模块。(文件夹(包)里有 init .py(初始化文件),hello.py(模块))
模块中含有函数库和类库。(函数和类)
if __name__ == "main" : pass elif __name__ == "module_name" : pass
2 pip指令
official::pip安装
official::setuptools安装
镜像源
pip < command > [ options ] pip -help :帮助 pip install name:安装包 pip uninstall name:卸载包 pip show name:查看包 pip download name:下载但不安装包 pip list:查看所有安装包 # 使用豆瓣的镜像进行升级 python -m pip install --upgrade pip -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
3 导入包 import 库 [as alias]from 库 import 函数from builtins import list as List
4 打包
链接
5 生成可执行文件
链接
pip install PyInstaller # 普通打包 pyinstaller -F myfile.py -i ico:装载图标(linux不行) # 窗口化应用程序作为单文件可执行文件 pyinstaller --onefile --windowed myfile.py
6 标准库
official::大全
6.1 do_cmd import oscmd = 'ipconfig /all' res = os.popen(cmd) output_str = res.buffer.read().decode(encoding='GB2312' ) print (output_str)import subprocessobj = subprocess.run( cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True , timeout=1 ) print ( obj.stderr ) print ( obj.stdout )
6.2 math
math库
math.perm(m,n) == A(m,n)(例:A(5 ,3 ) 为 5 * 4 * 3 ) math.comb(m,n) == C(m,n) math.gcd(m,n)
6.3 random
random库
random.random() random.randrange( start , end , step )
6.4 datetime
datetime库① datetime库②
import datetimedatetime.date.today() datetime.date.fromtimestamp(num) datetime.date.fromordinal(num) datetime.timedelta(days=num) now = datetime.datetime.strptime(date, '%Y-%m-%d' ).date() now += datetime.timedelta(1 )
6.5 turtle
turtle库
6.6 tkinter GUI
tkinter GUI库
import turtlet = turtle.Turtle() forward(n); backward(n) left(a);right(a) penup();pendown() pensize(s); pencolor(c) hideturtle() turtle.done()
6.7 hashlib import hashlibhashlib.func() obj = hashlib.md5() obj.update("Hello" .encode("utf-8" )) print (obj.hexdigest())
import hmacimport hashlibmac = hmac.new(b'key' ,b'hello' ,hashlib.md5) print (mac.digest()) print (mac.hexdigest())
6.8 结构化
struct详解
常用 fmt:
function
return
explain
pack(fmt,v1,v2,…)
string
按格式把数据转化成字节流
pack(fmt,buffer,offset,v1,v2,…)
None
写入以offset开始的buffer中
unpack(fmt,v1,v2,…)
tuple
解包
pack_from(fmt,buffer,offset)
tuple
以offset开始解包
calcsize(fmt)
size of fmt
计算fmt占多少字节
6.9 Urllib import itertoolsitertools.count(start=0 ,step=1 )
7 三方库
库导入
7.1 pygame
导弹追踪
7.2 pymssql
流程:
链接数据库。
新建游标。
执行 sql 操作,用 try,except,无异常数据提交,有异常回滚。
关闭数据库。
con = pymsssql.Connect(host,port,user,password,db) cursor = con.cursor() cursor.execute('sql' ) con.commit() con.rollback() cursor / con.close()
7.3 jieba
jieba库
7.4 cloudwords
cloudwords库
7.5 flask
Flask Web
from flask import Flaskapp = Flask(__name__) @app.route('/' ) def index_main (): return 'Hello World' @app.route('/bobo' ) def index_bobo (): return 'Hello bobo' @app.errorhandler(404 ) def page_error (error ): return "page not found" if __name__ == '__main__' : app.run() @app.route('/' ) def index_main (): return render_template('site.html' )
7.6 Django
text::Django
8 生成requirement
生成:pip freeze > requirements.txt
安装:pip install -r requirements.txt
十、Python高级
text::PyQt5
十一、高级用法
text::PyQt5
text::Python爬虫
text::Python渗透