Python 基础知识
文章目录
python 简介
在Python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。请始终牢记,代码越少,开发效率越高。
越低级的语言,越贴近计算机,抽象程度低,执行效率高,比如C语言;越高级的语言,越贴近计算,抽象程度高,执行效率低,比如Python语言。
人工智能领域:现在最流行的人工智能技术栈就是 TensorFlow 和 PyTorch
.py 文件申明
|
|
开发规范
开发环境根据自己的习惯安装 Python,推荐使用 pyenv,避免和已存在的版本造成冲突
安装完 Python 后安装 pipenv
通过使用环境变量控制必要的参数,如 redis 服务器地址,redis 队列名等,环境变量写在源码目录的 .env 文件中,格式如下:
|
|
基础知识点
-
__new__方法是创建类实例的方法, __new__方法的调用是发生在__init__之前
-
代码注释docstring: 出现在模块、函数、类、方法里第一个语句。可以用class_name.__doc__访问
-
CPython解释器: 对python语法的检查仅限于执行到的代码,故测试时必须所有逻辑判断都要测试一遍,这样才能保证代码不出语法错误!
-
python字符串连接符组合列表:+
1 2
s = 'A'+ 'B' # print('AB') L = [1] + [ L[x-1] + L[x] for x in range(1,len(L)) ] + [1] # +号用于组合列表
-
对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。eg: var.replace(‘A’, ‘a’)
-
赋值:n, a, b = 0, 0, 1 #同时赋值多个变量,相当于t = (0, 0, 1) n=t[0] a=t[1] b=t[2] #t是一个tuple
-
大部分字符转义使用\,而格式化字符串时%的转义使用%。
-
函数定义需要进行参数检查
-
在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便
-
python中List删除元素的几种方法
1 2 3 4 5 6 7
li = [1,2,3,4,5,6] # 1.使用del删除对应下标的元素 del li[2] #print(li) -> li = [1,2,4,5,6] # 2.删除指定值的元素 li.remove(4) # print(li) -> li = [1,2,5,6]
-
以后遇到了IndentationError: unexpected indent你就要知道python编译器是在告诉你“Hi,老兄,你的文件里格式不对了,可能是tab和空格没对齐的问题,你需要检查下tab和空格了”。
-
Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。
-
is检查两个对象是否是同一个对象,而==检查他们是否相等.
-
把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。
-
函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数
-
字符串单引号、双引号、三引号
- 单引号中可以使用双引号,中间的会当作字符串输出
- 双引号中可以使用单引号,中间的会当作字符串输出
- 三单引号和三双引号中间的字符串在输出时保持原来的格式。[包含换行符]
-
字符串格式化的两种方式:
-
使用format() [推荐使用这种方式,格式方式更多]
“{1} {0} {1}".format(“hello”, “world”) # 设置指定位置
“网站名:{name}, 地址 {url}".format(name=“菜鸟教程”, url=“www.runoob.com”)
“{:.2f}".format(3.1415926)
-
使用%
print(“the length of (%s) is %d” %(‘Hello World’,len(‘Hello World’)))
-
-
列表list对 + 和
*
的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。 -
字符串和编码转换:str和bytes互相转换时,需要指定编码。最常用的编码是UTF-8。chr/ord, encode/decode
-
错误异常处理机制
Python内置的try…except…else…finally用来处理错误十分方便。出错时,会分析错误信息并定位错误发生的代码位置才是最关键的。[通用捕捉异常错误代码:except Exception as e]
-
代码调试
如果要比较爽地设置断点、单步执行,就需要一个支持调试功能的IDE。目前比较好的Python IDE有PyCharm。
虽然用IDE调试起来比较方便,但是最后你会发现,logging才是终极武器。
-
IO编程:
IO在计算机中指Input/Output,也就是输入和输出。由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要IO接口。
IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动。Input Stream就是数据从外面(磁盘、网络)流进内存,Output Stream就是数据从内存流到外面去。对于浏览网页来说,浏览器和新浪服务器之间至少需要建立两根水管,才可以既能发数据,又能收数据。
-
图形界面:Python内置的Tkinter可以满足基本的GUI程序的要求
-
dict 和 set: set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。【可以用于list去重】
-
字符串前加 r 和 u 的作用
- 字符串前加u:后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。
- 字符串前加r: 去掉反斜杠的转移机制,常用于正则表达式
定义默认参数
定义默认参数要牢记一点:默认参数必须指向不变对象
- 不变对象:str, None, tuple, int, florat
- 可变对象:list
为什么要设计str、None这样的不变对象呢?因为不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修改数据导致的错误。此外,由于对象不变,多任务环境下同时读取对象不需要加锁,同时读一点问题都没有。我们在编写程序时,如果可以设计一个不变对象,那就尽量设计成不变对象。
对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。-
|
|
参数分类
-
可变参数。顾名思义,可变参数就是传入的参数个数是可变的
-
关键字参数
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
-
命名关键字参数
-
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
所以,对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。
模块
-
在Python中,一个.py文件就称之为一个模块(Module)
为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。
[请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是上层文件名]
-
标准文件模板:
-
__name__有2个取值:当模块是被调用执行的,取值为模块的名字;当模块是直接执行的,则该变量取值为:main
-
安装第三方模块:
在Python中,安装第三方模块,是通过包管理工具pip或pip3完成的。eg: pip install Pillow
1 2
pip list # 查看已安装的module help('modules') # 查看系统自带的moudle
高级特性
-
切片:Python的切片非常灵活,一行代码就可以实现很多行循环才能完成的操作。
可以处理list/tuple/string等数据类型 eg: L[0:10:2] #从索引0开始,到9结束,每隔两个取数;
L[::-1] # 倒序每隔一个取数
-
迭代: for in
-
列表生成式:
L = [x * x for x in range(10)]
-
生成器[generator]:一边循环一边计算的机制。【两种语法:一:将列表生成式的[]改成()就变成了一种生成器,二:包含yield关键字的函数】
g = (x * x for x in range(10))
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# 杨辉三角高级算法: def triangles(): L = [1] while True: yield L L.append(0) #精髓所在 L = [L[i-1] + L[i] for i in range(len(L))] n = 0 for m in triangles(): print(m) n = n + 1 if n == 10: break
调用方法:
<1> send() #生成器函数最大的特点是可以接受外部传入的一个变量,并根据变量内容计算结果后返回。
<2> close(0) #手动关闭生成器函数,后面的调用会直接返回StopIteration异常。
<3> throw() #用来向生成器函数送入一个异常,可以结束系统定义的异常,或者自定义的异常。throw()后直接跑出异常并结束程序,或者消耗掉一个yield,或者在没有下一个yield的时候直接进行到程序的结尾。
生成器函数最大的特点是可以接受外部传入的一个变量,并根据变量内容计算结果后返回。
-
迭代器[Iterator]:可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数。
Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。【惰性序列】
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
-
生成器和迭代器的区别:迭代器 包含 生成器。
函数式编程
-
map/filter : 返回一个Iterator
-
reduce/sorted: 直接返回值#
-
返回函数
闭包:相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
-
匿名函数
lambda 定义了一个匿名函数,直接return 一个返回值
lambda 并不会带来程序运行效率的提高,只会使代码更简洁。
Python lambda总共以下2种写法,一种是不含if…else…的,一种是包含if…else…的:
lambda :
lambda : if else
-
装饰器:decorator可以增强函数的功能
代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)
-
偏函数
当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。
常用命令
|
|