Python2 和 Python3 并存
Python3 安装配置
参考链接:
https://www.cnblogs.com/gaoyuechen/p/8006365.html
安装完成后自带 pip 等
1 | # 下载包 |
pip3 安装配置
env3 安装配置
判断数据类型
第一种:types
import types
type(x) is types.IntType # 判断是否 int 类型
type(x) is types.StringType # 判断是否 string 类型
第二种: 超级恶心的模式,不推荐
type(x) == type(1) # 判断是否 int 类型
type(x) == type(“1”) # 判断是否 string 类型
第三种: isinstance
isinstance(对象,类型名或类型列表或元祖) –> True/False
例如:isinstance(“lst”,(int,str,list)) # True
判断类型 “lst” 在 类型列表中
Python 代码建议
1 | from .. import |
Python -m xxx.py -m 使得一个模块像脚本一样运行
name
package
Python 的* __ xx的区别
①*函数名 意味着,此函数用于类内部,不属于 api ,等同于私有函数
②函数名 ,用来避免子类覆盖其内容,意味着此函数不能被重写,继承等。仅仅用于类的内部使用,
③xx函数,用于 Python 调用
使用_one_underline 来表示该方法或属性是私有的,不属于 API;
当创建一个用于 python 调用或一些特殊情况时,使用two_underline;
使用just_to_underlines,来避免子类的重写!
使用 join 连接字符 ,join 连接字符更高高效比+ ,尤其是大规模的字符串连接
join 使用:
‘xx’.join([str1,str2]) = str1xxstr2
‘xx’.join([str1,str2,str3]) = str1xxstr2xxstr3
时间测试,代码的性能分析
import timeit
生成测试所需的字符数组
格式化字符串优先使用.format,而不是%s 等
.format 的使用方法 1.位置符号
“ select _ from {0} where 1=1 {2} “.format(xx,yy) 2.使用名称
“ select _ from {xx} where 1=1 {yy} “.format(xx=1,yy=1) 3.同过属性
xx = 1
yy = 2
“ select * from {xx} where 1=1 {yy} “.format 4.格式化元组的具体项
point = (1,3)
‘x:{0[0]}; y:{0[1]}’.format(point)
.format 的优势
使用灵活,可以作为参数传递,简便直观,%s 处理需要注意被格式化字符的格式而。format 不需要
通过字符串调用对象属性
python 通过字符串调用对象属性或方法的实例讲解
有时候需要将属性或方法作为参数传入,这个时候可以通过以下几种方式用字符串调用对象属性或方法
1 | 1.eval |
uuid [唯一标识符]
UUID: 通用唯一标识符 ( Universally Unique Identifier ),对于所有的 UUID 它可以保证在空间和时间上的唯一性.
它是通过 MAC 地址、 时间戳、 命名空间、 随机数、 伪随机数来保证生成 ID 的唯一性,,有着固定的大小( 128 bit 位 ),通常由 32 字节的字符串(十六进制)表示。
它的唯一性和一致性特点,使得可以无需注册过程就能够产生一个新的 UUID;
UUID 可以被用作多种用途, 既可以用来短时间内标记一个对象,也可以可靠的辨别网络中的持久性对象。
1 | import uuid |
总结:
- 分布式环境: 建议 uuid1
- 名字唯一要求:建议 uuid3/uuid5
文字处理
Levenshtein 文字距离
import Levenshtein
str1 = ‘qwer1235’
str2 = ‘qwe1235r’
计算汉明距离,要求 str1 和 str2 必须长度一致。是描述两个等长字串之间对应位置上不同字符的个数
Levenshtein.hamming(str1, str2) #
Levenshtein.distance(str1,str2)计算编辑距离。是描述一个字符串转化成另一个字串最少的操作次数,在其中的操作包括插入、删除、替换。
Levenshtein.distance(str1, str2)
HTTP url转义
1 | 空格 用%20代替 |
Python功能模块
Python2 和 Python3 并存
Python3 安装配置
参考链接:
https://www.cnblogs.com/gaoyuechen/p/8006365.html
安装完成后自带 pip 等
1 | # 下载包 |
pip3 安装配置
env3 安装配置
判断数据类型
第一种:types
import types
type(x) is types.IntType # 判断是否 int 类型
type(x) is types.StringType # 判断是否 string 类型
第二种: 超级恶心的模式,不推荐
type(x) == type(1) # 判断是否 int 类型
type(x) == type(“1”) # 判断是否 string 类型
第三种: isinstance
isinstance(对象,类型名或类型列表或元祖) –> True/False
例如:isinstance(“lst”,(int,str,list)) # True
判断类型 “lst” 在 类型列表中
Python 代码建议
1 | from .. import |
Python -m xxx.py -m 使得一个模块像脚本一样运行
name
package
Python 的* __ xx的区别
①*函数名 意味着,此函数用于类内部,不属于 api ,等同于私有函数
②函数名 ,用来避免子类覆盖其内容,意味着此函数不能被重写,继承等。仅仅用于类的内部使用,
③xx函数,用于 Python 调用
使用_one_underline 来表示该方法或属性是私有的,不属于 API;
当创建一个用于 python 调用或一些特殊情况时,使用two_underline;
使用just_to_underlines,来避免子类的重写!
使用 join 连接字符 ,join 连接字符更高高效比+ ,尤其是大规模的字符串连接
join 使用:
‘xx’.join([str1,str2]) = str1xxstr2
‘xx’.join([str1,str2,str3]) = str1xxstr2xxstr3
时间测试,代码的性能分析
import timeit
生成测试所需的字符数组
格式化字符串优先使用.format,而不是%s 等
.format 的使用方法 1.位置符号
“ select _ from {0} where 1=1 {2} “.format(xx,yy) 2.使用名称
“ select _ from {xx} where 1=1 {yy} “.format(xx=1,yy=1) 3.同过属性
xx = 1
yy = 2
“ select * from {xx} where 1=1 {yy} “.format 4.格式化元组的具体项
point = (1,3)
‘x:{0[0]}; y:{0[1]}’.format(point)
.format 的优势
使用灵活,可以作为参数传递,简便直观,%s 处理需要注意被格式化字符的格式而。format 不需要
通过字符串调用对象属性
python 通过字符串调用对象属性或方法的实例讲解
有时候需要将属性或方法作为参数传入,这个时候可以通过以下几种方式用字符串调用对象属性或方法
1 | 1.eval |
获取目录下所有文件名称
1 | file_dir = "sss" |
uuid [唯一标识符]
UUID: 通用唯一标识符 ( Universally Unique Identifier ),对于所有的 UUID 它可以保证在空间和时间上的唯一性.
它是通过 MAC 地址、 时间戳、 命名空间、 随机数、 伪随机数来保证生成 ID 的唯一性,,有着固定的大小( 128 bit 位 ),通常由 32 字节的字符串(十六进制)表示。
它的唯一性和一致性特点,使得可以无需注册过程就能够产生一个新的 UUID;
UUID 可以被用作多种用途, 既可以用来短时间内标记一个对象,也可以可靠的辨别网络中的持久性对象。
1 | import uuid |
总结:
- 分布式环境: 建议 uuid1
- 名字唯一要求:建议 uuid3/uuid5
文字处理
Levenshtein 文字距离
import Levenshtein
str1 = ‘qwer1235’
str2 = ‘qwe1235r’
计算汉明距离,要求 str1 和 str2 必须长度一致。是描述两个等长字串之间对应位置上不同字符的个数
Levenshtein.hamming(str1, str2) #
Levenshtein.distance(str1,str2)计算编辑距离。是描述一个字符串转化成另一个字串最少的操作次数,在其中的操作包括插入、删除、替换。
Levenshtein.distance(str1, str2)
HTTP url转义
1 | 空格 用%20代替 |
title: Python-进阶知识点tips
url_path: python/advance/tips
tags:
- python
- python-进阶
- ★★★★★
categories: - python
- python-进阶
description: 进阶
autoauto - [Python2 和 Python3 并存](#python2-和-python3-并存)auto - [Python3 安装配置](#python3-安装配置)auto - [pip3 安装配置](#pip3-安装配置)auto - [env3 安装配置](#env3-安装配置)auto - [判断数据类型](#判断数据类型)auto - [Python 代码建议](#python-代码建议)auto - [生成测试所需的字符数组](#生成测试所需的字符数组)auto - [通过字符串调用对象属性](#通过字符串调用对象属性)auto - [uuid [唯一标识符]](#uuid-唯一标识符)auto - [文字处理](#文字处理)auto - [Levenshtein 文字距离](#levenshtein-文字距离)auto - [HTTP `url转义`](#http-url转义)auto- [Python功能模块](#python功能模块)auto - [Python2 和 Python3 并存](#python2-和-python3-并存-1)auto - [Python3 安装配置](#python3-安装配置-1)auto - [pip3 安装配置](#pip3-安装配置-1)auto - [env3 安装配置](#env3-安装配置-1)auto - [判断数据类型](#判断数据类型-1)auto - [Python 代码建议](#python-代码建议-1)auto - [生成测试所需的字符数组](#生成测试所需的字符数组-1)auto - [通过字符串调用对象属性](#通过字符串调用对象属性-1)auto - [获取目录下所有文件名称](#获取目录下所有文件名称)auto - [uuid [唯一标识符]](#uuid-唯一标识符-1)auto - [文字处理](#文字处理-1)auto - [Levenshtein 文字距离](#levenshtein-文字距离-1)auto - [HTTP `url转义`](#http-url转义-1)auto - [魔法函数](#魔法函数)auto - [高级特性/语法糖](#高级特性语法糖)auto - [进阶知识点](#进阶知识点)auto - [函数式编程](#函数式编程)auto - [高阶函数](#高阶函数)auto - [匿名函数](#匿名函数)auto - [闭包](#闭包)auto - [python 循环中不包含域的概念](#python-循环中不包含域的概念)auto - [装饰器](#装饰器)auto - [偏函数](#偏函数)auto - [模块和包的概念](#模块和包的概念)auto - [Python 面向对象编程](#python-面向对象编程)auto - [类属性](#类属性)auto - [实例方法](#实例方法)auto - [类方法](#类方法)auto - [类的继承](#类的继承)auto - [判断类型](#判断类型)auto - [多态](#多态)auto - [多重继承](#多重继承)auto - [获取对象信息](#获取对象信息)auto - [特殊方法](#特殊方法)auto - [动态获取函数变量等](#动态获取函数变量等)auto - [小知识点 Tips](#小知识点-tips)auto - [打包与解包](#打包与解包)auto - [json 序列化](#json-序列化)auto - [`_xxx`,`__xxx`和`__xxx__`的区别](#_xxx__xxx和__xxx__的区别)auto - [其他知识](#其他知识)auto - [参考资源](#参考资源)autoauto
魔法函数
高级特性/语法糖
Python 高级特性,对于 Python 知识上限和优雅高效代码所必需的,是 Python 程序员从初级到高级不可缺少的知识历程。
进阶知识点
函数式编程
Python 支持的函数式编程
- A.不是纯函数式编程:允许有变量(纯函数式编程:不需要变量,没有副作用,测试简单
- B.支持高阶函数:函数可以作为变量传入
- C.支持闭包:有了闭包就能返回函数
- D.有限度地支持匿名函数
支持函数式编程,函数式编程的特点
@偏向于计算,而非指令,把计算视为函数而非指令
@不需要变量,无副作用,测试简单
@支持高阶函数,代码简洁
python 函数式编程的特点:
@不是纯函数式编程,可以有变量
@支持高阶函数,允许函数作为变量传入
@允许闭包,有了闭包就有返回函数
@有限度的支持匿名函数
高阶函数
@变量可以指向函数
@函数的参数可以接收变量
@一个函数可以接收另一个函数作为参数
@能接收函数作参数就是高阶参数
能接收函数作参数的函数就是高阶函数
常见的高阶函数
- map()
- reduce()
- filter()
- sorted()
TODO 所有高阶函数清单,部分用法等
1 | #map函数,对单个参数进行处理 |
匿名函数
@高阶函数可以接收函数做参数,有些时候,我们不需要显式地定义函数,直接传入匿名函数更方便
1 | lambda x: x * 2 |
闭包
Python 的函数不但可以返回 int,str,list,dict 等数据类型,还可以返回函数
Python 中闭包,在函数内部定义的函数和外部定义的函数式一样的,只是无法被外部访问,如果有被定义在外函数内部的情况,并且内层函数引用了外层函数的参数,然后返回内层函数的情况,我们称为闭包.
闭包的特点是返回的函数还引用了外层函数的局部变量,所以要正确地使用闭包,就要确保引用的局部变量在函数返回后不能变.
闭包概念:在一个内部函数中,对外部作用域的变量进行引用,(并且一般外部函数的返回值为内部函数),那么内部函数就被认为是闭包
Python 闭包,类似于 子函数
python 循环中不包含域的概念
1 | # python循环中不包含域的概念 |
装饰器
Python 内置的@语法就是为了简化装饰器调用
偏函数
函数在执行时,要带上所有必要的参数进行调用。但是,有时参数可以在函数被调用之前提前获知。这种情况下,一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用。
偏函数是将所要承载的函数作为 partial()函数的第一个参数,原函数的各个参数依次作为 partial()函数后续的参数,除非使用关键字参数。
1 | from functools import partial |
模块和包的概念
包就是文件夹,模块名就是.py
包下面有个init.py 这样 python 才会当做包来处理
Python 面向对象编程
TODO
面向对象编程是一种程序设计范式
把程序看做不同对象的相互调用
对现实世界建立对象模型
基本思想
类用于定义抽象类型
实例根据类的定义被创建出来
最重要的思想:数据封装
由于 Python 是动态语言,对每一个实例,都可以直接给他们的属性赋值
可以给一个实例绑定很多属性,如果不希望被外部访问到,可以用双下划线开头,该属性就无法被外部访问.但是如果一个属性以 xxx的形式定义,则又可以被外部访问了,以xxx定义的属性在 python 的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常不把普通属性用xxx__定义
类属性
类里面属性分为 类属性(独有一份)和实例属性(每个实例都会有一份)。
当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。不要在实例上修改类属性,它实际上并没有修改类属性,而是给实例绑定了一个实例属性
实例方法
实例的方法就是在类中定义的函数,它的第一个参数永远是 self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样的:在实例方法内部,可以访问所有实例属性,这样,如果外部需要访问私有属性,可以通过方法调用获得,这种数据封装的形式除了能保护内部数据一致性外,还可以简化外部调用的难度。
在 class 中定义的实例方法其实也是属性,实际上是一个函数对象,因为方法也是一个属性,所以它也可以动态地添加到实例上,只是需要用 type.MethodType()把一个函数变为一个方法
类方法
和属性类似,方法也分实例方法和类方法.在 class 中定义的全部是实例方法,实例方法第一个参数 self 是实例本身.通过标记@classmethod 该方法将绑定到类上,而非类的实例上,该方法的第一个参数将传入类本身,通常将参数名命名为 cls,因为是在类上调用,而非实例上调用,因此类方法无法获取任何实例变量,只能获得类的引用
1 | # @classmethod 指定类方法 |
类的继承
子类和父类是 is 关系,总是从某各类继承 如果没有合适的就从 object 继承,不能忘记调用 super().init
如果已经定义了 Person 类,需要定义新的 Student 和 Teacher 类时,可以直接从 Person 类继承:
1 | class Person(object): |
定义 Student 类时,只需要把额外的属性加上,例如 score:
1 | class Student(Person): |
一定要用 super(Student, self).__init__(name, gender)
去初始化父类,否则,继承自 Person 的 Student 将没有 name 和 gender。
函数super(Student, self)
将返回当前类继承的父类,即 Person ,然后调用__init__()
方法,注意 self 参数已在 super()中传入,在__init__()
中将隐式传递,不需要写出(也不能写)。
判断类型
判断数据类型
1 | isinstance("ss", (str,list) ) |
TODO 判断实例类似等等
继承链上,一个父类的实例不能是子类类型,因为子类比父类多了一些属性和方法,一个实例可以看成它本身的类型,也可以看成它父类的类型。
多态
TODO
多重继承
获取对象信息
isinstance()判断是否是某种类型的实例外
type()函数获取变量的类型,返回一个 Type 对象
dir()函数获取变量的所有属性
getattr()获取属性值
setattr()设置属性值
特殊方法
又名魔法方法、魔法函数等等
动态获取函数变量等
动态获取当前运行的函数名
1 | # 在函数外部时,获取函数名称 |
inspect
模块 动态获取当前运行的函数名称
1 | # coding:utf-8 |
小知识点 Tips
打包与解包
1 | x, y ,*z = list(range(0,10)) |
json 序列化
1 |
|
_xxx
,__xxx
和__xxx__
的区别
(1)单下划线 _xxx
“单下划线”开始的成员函数和成员变量都是公开的(public)(但是约定俗成以此开头来设计私有函数/变量,尽管其是 public,理解,即只是标明,标记)。即类实例和子类实例都可以访问此中变量,但是需通过类提供的接口进行访问,不能用from xxx import *
导入
(2)双下划线 __xxx
从表象上看可以当做类中的私有变量/方法名,表示私有成员,即只有类对象自己才能访问,其自身的类实例或是其子类也不能访问。
Python 设计此的真正目的仅仅是为了避免子类覆盖父类的方法。
(3)__xxx__
系统定义名字,前后均有一个”双下划线”是代表 python 里特殊方法专用的表示,如init()代表类的构造函数
类的下划线命令区别
xx
:共有变量。_xx
:私有化的属性或方法,from xxx import * 时无法导入,子类的对象和子类可以访问。__xx
:避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)。__ xx __
:双前后下划线,用户名字空间的魔法对象或属性。例如:__init__
, 不要自己发明这样的名字。xx_
:单后置下划线,用于避免与 Python 关键词的冲突。
其他知识
map
filter
reduce
__solts__
来给定固定集合的属性分配空间,适合固定少属性的类,可以大量减少内存消耗
1 | # Python默认采用字典来保存类的实例属性,但对于小类来说,会浪费内存空间 |
collections
容器模块
1 | defaultdict |
inspect
获取活跃对象的信息
1 | # for .. else 语句 用于捕获for循环是正常结束还是break跳出 |
协程 - yield
1 |
|
1 | # 上下文管理器 |
参考资源
title: Python常用基础命令
url_path: python/base/常用命令
tags:
- python
- python-基础
categories: - python
- python-基础
description: Python常用基础命令
获取 os.system(cmd)的执行结果
1 | 由于os.system是没有返回值的,获取返回值有以下三种方式: |
print 同行替换输出 输出信息再同一行 进度条显示
1 | # python3 |
python 文件传入 参数
1 | #! /bin/python |
Python 生成 md5
1 | import md5 |
Excel 处理
在用 xlrd.open_workbook 时,添加对应的参数 formatting_info=True,就可以保留原有格式了
python 通过字符串调用对象属性或方法的实例讲解
1 | # eval |
使用 traceback 获取栈信息
traceback.print_exc()
获取详细的程序异常信息。
程序运行异常时会输出完整的栈信息,包括调用顺序、异常发生的语句、错误类型等。
import tarceback
try:
f()
except IndexError as ex:
print “程序异常”
print ex
print traceback.print_exc()#1.错误类型(IndexError)、错误对应的值(list index out of range)、具体的 trace 信息(文件名 行号 函数名 对应的代码)
sys.exc_info()
使用 dir 获取模块的方法 dir()
dir(traceback)
美化打印
1 | # Python的美化打印 特别是打印 嵌套字典时非常好用 |
Python-tips 小知识点
tags: 202101
title: Python-进阶知识点 tips
url_path: python/advance/tips
tags:
- python
- python-进阶
- ★★★★★
categories: - python
- python-进阶
description: 进阶
- Python功能模块
- Python-tips 小知识点
- Python 之大坑
魔法函数
高级特性/语法糖
Python 高级特性,对于 Python 知识上限和优雅高效代码所必需的,是 Python 程序员从初级到高级不可缺少的知识历程。
进阶知识点
函数式编程
Python 支持的函数式编程
- A.不是纯函数式编程:允许有变量(纯函数式编程:不需要变量,没有副作用,测试简单
- B.支持高阶函数:函数可以作为变量传入
- C.支持闭包:有了闭包就能返回函数
- D.有限度地支持匿名函数
支持函数式编程,函数式编程的特点
@偏向于计算,而非指令,把计算视为函数而非指令
@不需要变量,无副作用,测试简单
@支持高阶函数,代码简洁
python 函数式编程的特点:
@不是纯函数式编程,可以有变量
@支持高阶函数,允许函数作为变量传入
@允许闭包,有了闭包就有返回函数
@有限度的支持匿名函数
高阶函数
@变量可以指向函数
@函数的参数可以接收变量
@一个函数可以接收另一个函数作为参数
@能接收函数作参数就是高阶参数
能接收函数作参数的函数就是高阶函数
常见的高阶函数
- map()
- reduce()
- filter()
- sorted()
TODO 所有高阶函数清单,部分用法等
1 | #map函数,对单个参数进行处理 |
匿名函数
@高阶函数可以接收函数做参数,有些时候,我们不需要显式地定义函数,直接传入匿名函数更方便
1 | lambda x: x * 2 |
闭包
Python 的函数不但可以返回 int,str,list,dict 等数据类型,还可以返回函数
Python 中闭包,在函数内部定义的函数和外部定义的函数式一样的,只是无法被外部访问,如果有被定义在外函数内部的情况,并且内层函数引用了外层函数的参数,然后返回内层函数的情况,我们称为闭包.
闭包的特点是返回的函数还引用了外层函数的局部变量,所以要正确地使用闭包,就要确保引用的局部变量在函数返回后不能变.
闭包概念:在一个内部函数中,对外部作用域的变量进行引用,(并且一般外部函数的返回值为内部函数),那么内部函数就被认为是闭包
Python 闭包,类似于 子函数
python 循环中不包含域的概念
1 | # python循环中不包含域的概念 |
装饰器
Python 内置的@语法就是为了简化装饰器调用
偏函数
函数在执行时,要带上所有必要的参数进行调用。但是,有时参数可以在函数被调用之前提前获知。这种情况下,一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用。
偏函数是将所要承载的函数作为 partial()函数的第一个参数,原函数的各个参数依次作为 partial()函数后续的参数,除非使用关键字参数。
1 | from functools import partial |
模块和包的概念
包就是文件夹,模块名就是.py
包下面有个init.py 这样 python 才会当做包来处理
Python 面向对象编程
TODO
面向对象编程是一种程序设计范式
把程序看做不同对象的相互调用
对现实世界建立对象模型
基本思想
类用于定义抽象类型
实例根据类的定义被创建出来
最重要的思想:数据封装
由于 Python 是动态语言,对每一个实例,都可以直接给他们的属性赋值
可以给一个实例绑定很多属性,如果不希望被外部访问到,可以用双下划线开头,该属性就无法被外部访问.但是如果一个属性以 xxx的形式定义,则又可以被外部访问了,以xxx定义的属性在 python 的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常不把普通属性用xxx__定义
类属性
类里面属性分为 类属性(独有一份)和实例属性(每个实例都会有一份)。
当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。不要在实例上修改类属性,它实际上并没有修改类属性,而是给实例绑定了一个实例属性
实例方法
实例的方法就是在类中定义的函数,它的第一个参数永远是 self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样的:在实例方法内部,可以访问所有实例属性,这样,如果外部需要访问私有属性,可以通过方法调用获得,这种数据封装的形式除了能保护内部数据一致性外,还可以简化外部调用的难度。
在 class 中定义的实例方法其实也是属性,实际上是一个函数对象,因为方法也是一个属性,所以它也可以动态地添加到实例上,只是需要用 type.MethodType()把一个函数变为一个方法
类方法
和属性类似,方法也分实例方法和类方法.在 class 中定义的全部是实例方法,实例方法第一个参数 self 是实例本身.通过标记@classmethod 该方法将绑定到类上,而非类的实例上,该方法的第一个参数将传入类本身,通常将参数名命名为 cls,因为是在类上调用,而非实例上调用,因此类方法无法获取任何实例变量,只能获得类的引用
1 | # @classmethod 指定类方法 |
类的继承
子类和父类是 is 关系,总是从某各类继承 如果没有合适的就从 object 继承,不能忘记调用 super().init
如果已经定义了 Person 类,需要定义新的 Student 和 Teacher 类时,可以直接从 Person 类继承:
1 | class Person(object): |
定义 Student 类时,只需要把额外的属性加上,例如 score:
1 | class Student(Person): |
一定要用 super(Student, self).__init__(name, gender)
去初始化父类,否则,继承自 Person 的 Student 将没有 name 和 gender。
函数super(Student, self)
将返回当前类继承的父类,即 Person ,然后调用__init__()
方法,注意 self 参数已在 super()中传入,在__init__()
中将隐式传递,不需要写出(也不能写)。
判断类型
判断数据类型
1 | isinstance("ss", (str,list) ) |
TODO 判断实例类似等等
继承链上,一个父类的实例不能是子类类型,因为子类比父类多了一些属性和方法,一个实例可以看成它本身的类型,也可以看成它父类的类型。
多态
TODO
多重继承
获取对象信息
isinstance()判断是否是某种类型的实例外
type()函数获取变量的类型,返回一个 Type 对象
dir()函数获取变量的所有属性
getattr()获取属性值
setattr()设置属性值
特殊方法
又名魔法方法、魔法函数等等
动态获取函数变量等
动态获取当前运行的函数名
1 | # 在函数外部时,获取函数名称 |
inspect
模块 动态获取当前运行的函数名称
1 | # coding:utf-8 |
小知识点 Tips
打包与解包
1 | x, y ,*z = list(range(0,10)) |
json 序列化
1 |
|
_xxx
,__xxx
和__xxx__
的区别
(1)单下划线 _xxx
“单下划线”开始的成员函数和成员变量都是公开的(public)(但是约定俗成以此开头来设计私有函数/变量,尽管其是 public,理解,即只是标明,标记)。即类实例和子类实例都可以访问此中变量,但是需通过类提供的接口进行访问,不能用from xxx import *
导入
(2)双下划线 __xxx
从表象上看可以当做类中的私有变量/方法名,表示私有成员,即只有类对象自己才能访问,其自身的类实例或是其子类也不能访问。
Python 设计此的真正目的仅仅是为了避免子类覆盖父类的方法。
(3)__xxx__
系统定义名字,前后均有一个”双下划线”是代表 python 里特殊方法专用的表示,如init()代表类的构造函数
类的下划线命令区别
xx
:共有变量。_xx
:私有化的属性或方法,from xxx import * 时无法导入,子类的对象和子类可以访问。__xx
:避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)。__ xx __
:双前后下划线,用户名字空间的魔法对象或属性。例如:__init__
, 不要自己发明这样的名字。xx_
:单后置下划线,用于避免与 Python 关键词的冲突。
其他知识
map
filter
reduce
__solts__
来给定固定集合的属性分配空间,适合固定少属性的类,可以大量减少内存消耗
1 | # Python默认采用字典来保存类的实例属性,但对于小类来说,会浪费内存空间 |
collections
容器模块
1 | defaultdict |
inspect
获取活跃对象的信息
1 | # for .. else 语句 用于捕获for循环是正常结束还是break跳出 |
协程 - yield
1 |
|
1 | # 上下文管理器 |
参考资源
Python 之大坑
环境说明:
- python 3.8.3
Python 之大坑清单:
- 可变对象
- 不要使用可变对象作为函数默认值
- 迭代函数中,可变对象需要使用深拷贝赋值!
说明:很多原有Python2.7
的 bug 在Python3.8
中已经修复了
Python 之坑
不要使用可变对象作为函数默认值
1 | def append(value, arr=[]): |
原因是模块在加载的时候,arr 定义指向了一个空的列表的地址,以后再次调用时,不是我们理解的再给 arr 分配
一个新的空的列表,而是一直指向的同一个地址的列表,如果列表内容变了其引用也跟着变了。定义默认参数要
默认参数必须指向不可变对象!!!
生成器不保留迭代过后的结果
1 | gen = (i for i in range(5)) |
原因是生成器中的值一旦使用过后,就不再保留了。这个是生成器的原理导致的,生成器不像列表,一开始就把值都初始化好了,而是每次用到的时候生成一个。
解决方法:
1 | gen = (i for i in range(5)) |
可变对象之坑
原代码样例
1 | import copy |
修改方案:不要使用可变对象作为函数默认值!!!
1 | import copy |
修改方案:迭代函数中,可变对象需要使用深拷贝赋值!!!
1 | import copy |
is 和 == 的差异
- is 用于判断 两个变量 引用对象是否为同一个
- == 用于判断 引用变量的值 是否相等
已修复的坑
1 | # 1. 列表推导式中的对象泄露问题 |
title: Python常用基础命令
url_path: python/base/常用命令
tags:
- python
- python-基础
categories: - python
- python-基础
description: Python常用基础命令
获取 os.system(cmd)的执行结果
1 | 由于os.system是没有返回值的,获取返回值有以下三种方式: |
print 同行替换输出 输出信息再同一行 进度条显示
1 | # python3 |
python 文件传入 参数
1 | #! /bin/python |
Python 生成 md5
1 | import md5 |
Excel 处理
在用 xlrd.open_workbook 时,添加对应的参数 formatting_info=True,就可以保留原有格式了
python 通过字符串调用对象属性或方法的实例讲解
1 | # eval |
使用 traceback 获取栈信息
traceback.print_exc()
获取详细的程序异常信息。
程序运行异常时会输出完整的栈信息,包括调用顺序、异常发生的语句、错误类型等。
import tarceback
try:
f()
except IndexError as ex:
print “程序异常”
print ex
print traceback.print_exc()#1.错误类型(IndexError)、错误对应的值(list index out of range)、具体的 trace 信息(文件名 行号 函数名 对应的代码)
sys.exc_info()
使用 dir 获取模块的方法 dir()
dir(traceback)
美化打印
1 | # Python的美化打印 特别是打印 嵌套字典时非常好用 |