数据类型:整数、浮点数、字符串、布尔值、空值(None)
变量:变量名必须是大小写英文、数字和_的组合,且不能用数字开头
常量:常量就是不能变的变量,在Python中,通常用全部大写的变量名表示常量
ASCII编码:127位最早
GB2312编码:中文编入
Unicode:统一的一套编码
UTF-8编码:把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。
Python字符串是以Unicode编码的
Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符
在文件开头写上这两行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
%s
永远起作用,它会把任何数据类型转换为字符串
list是一种有序的集合,可以随时添加和删除其中的元素。
元组,tuple和list非常类似,但是tuple一旦初始化就不能修改
if <条件判断1>:
<执行1>
elif <条件判断2>:
<执行2>
elif <条件判断3>:
<执行3>
else:
<执行4>
如果要针对某个变量匹配若干种情况,可以使用match语句
score = 'B'
match score:
case 'A':
print('score is A.')
case 'B':
print('score is B.')
case 'C':
print('score is C.')
case _: # _表示匹配到其他任何情况
print('score is ???.')
for…in循环
names = ['Michael', 'Bob', 'Tracy']
for name in names:
print(name)
while循环
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
break
在循环中,break语句可以提前退出循环
continue
在循环过程中,也可以通过continue语句,跳过当前的这次循环,直接开始下一次循环。
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
和list比较,dict有以下几个特点:
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
Python内置了很多有用的函数,我们可以直接调用。
比如求绝对值的函数abs
>>> abs(100)
100
数据类型转换
Python内置的常用函数还包括数据类型转换函数,比如int()函数可以把其他数据类型转换为整数:
>>> int('123')
123
在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
def my_abs(x):
if x >= 0:
return x
else:
return -x
参数检查
调用函数时,如果参数个数不对,Python解释器会自动检查出来,并抛出TypeError
:
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
设置默认参数时,有几点要注意:
一是必选参数在前,默认参数在后,否则Python的解释器会报错(思考一下为什么默认参数不能放在必选参数前面);
二是如何设置默认参数。
当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
def person(name, age, *, city, job):
print(name, age, city, job)
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
L[0:3]
表示,从索引0开始取,直到索引3为止,但不包括索引3next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。args
,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用,所以,闭包用起来简单,实现起来可不容易。def inc():
x = 0
def fn():
nonlocal x
x = x + 1
return x
return fn
f = inc()
print(f()) # 1
print(f()) # 2
x
作为局部变量并没有初始化,直接计算x+1
是不行的。但我们其实是想引用inc()函数内部的x,所以需要在fn()
函数内部加一个nonlocal x
的声明。加上这个声明后,解释器把fn()
的x看作外层函数的局部变量,它已经被初始化了,可以正确计算x+1
。
当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
匿名函数lambda x: x * x
实际上就是:
def f(x):
return x * x
关键字lambda
表示匿名函数,冒号前面的x表示函数参数。
在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
通过设定参数的默认值,可以降低函数调用的难度。而偏函数也可以做到这一点。
functools.partial
就是帮助我们创建一个偏函数的,不需要我们自己定义int2()
,可以直接使用下面的代码创建一个新的函数int2:
>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85
在Python中,一个.py文件就称之为一个模块(Module)。
为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。
举个例子,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。
现在,假设我们的abc和xyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名,比如mycompany,按照如下目录存放:
mycompany
├─ init.py
├─ abc.py
└─ xyz.py
引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py
模块的名字就变成了mycompany.abc
,类似的,xyz.py
的模块名变成了mycompany.xyz
。
请注意,每一个包目录下面都会有一个__init__.py
的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py
可以是空文件,也可以有Python代码,因为__init__.py
本身就是一个模块,而它的模块名就是mycompan
。
import xx
导入模块在Python中,安装第三方模块,是通过包管理工具pip完成的。
pip install Pillow
可以从Anaconda官网下载GUI安装包,下载后直接安装,Anaconda会把系统Path中的python指向自己自带的Python,并且,Anaconda安装的第三方模块会安装在Anaconda自己的路径下,不影响系统已安装的Python目录。
>>> import sys
>>> sys.path.append('/Users/michael/my_py_scripts')
这种方法是在运行时修改,运行结束后失效。
PYTHONPATH
,该环境变量的内容会被自动添加到模块搜索路径中。参考资料:
廖雪峰官网