- 解释型语言
- Python不是纯函数式编程语言
- 四个空格的缩进
- Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行
#!/usr/bin/env python3 # -*- coding: utf-8 -*-
- 大小写敏感
- I/O:input() print()
- 字符编码:
- 字符串是以Unicode编码的,支持多语言
- 要计算
str
包含多少个字符,可以用len()
函数 - 单个字符的编码:
- chr()函数把编码转换为对应的字符:
ord()
函数获取字符的整数表示
- 数据类型:
- 整型:
- 十六进制用
0x
前缀 - 对于很大的数,允许在数字中间以
_
分隔,因此,写成10_000_000_000
和10000000000
是完全一样的 - 整数没有大小限制
- 十六进制用
- 浮点数
-
空值:
None
表示,None
不能理解为0
,因为0
是有意义的,而None
是一个特殊的空值 -
布尔值:可以用
and
、or
和not
运算 -
字符串:
- 转义字符
\
- Python允许用
'''...'''
的格式表示多行
- 转义字符
-
常量:习惯上的用法:全部大写表示
-
除法:
-
一种除法是
/
:结果是浮点数,即使是两个整数恰好整除,结果也是浮点数 -
一种除法是
//
,称为地板除,两个整数的除法仍然是整数,即使除不尽。
-
- list:列表[]
- 有序的集合,类似其他语言的数组
- 要取最后一个元素,除了计算索引位置外,还可以用
-1
做索引,直接获取最后一个元素 - len() :获得list元素的个数
- append():list中追加元素到末尾
- insert():把元素插入到指定的位置
- pop():删除list末尾的元素;
pop(i)
删除指定位置的元素
- tuple:元组()
- 一旦初始化就不能修改,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向
'a'
,就不能改成指向'b'
,指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的! - 只有1个元素的tuple定义时必须加一个逗号:t(1,)
- 一旦初始化就不能修改,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向
- dict:字典[]
- 在其他语言中也称为map,使用键-值(key-value)存储
- 要删除一个key,用
pop(key)
方法,对应的value也会从dict中删除: - 要避免key不存在的错误,有两种办法
- 通过
in
判断key是否存在 get()
方法
- 通过
- set:()
- 和dict类似,也是一组key的集合,但不存储value。由于key不能重复
- 可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作
add(key)
方法可以添加元素到set中,可以重复添加,但不会有效果:remove(key)
方法可以删除元素:
- 整型:
- 循环:
- for in
- while
range()
函数,可以生成一个整数序列
- 函数:
- Python的函数返回多值其实就是返回一个tuple
- 在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
- 默认参数:定义默认参数要牢记一点:默认参数必须指向不变对象!
- 可变参数:
*args
是可变参数,args接收的是一个tuple;- Python允许你在list或tuple前面加一个
*
号,把list或tuple的元素变成可变参数传进去
- 关键字参数:
**kw
是关键字参数,kw接收的是一个dict
- 命名的关键字参数:
- 是为了限制调用者可以传入的参数名,同时可以提供默认值。
- 定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符
*
,否则定义的将是位置参数。
- 高阶函数
- 既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数
- 函数本身也可以赋值给变量,即:变量可以指向函数
map()
函数接收两个参数,一个是函数,一个是Iterable
,map
将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator
返回。reduce()
函数必须接收两个参数,reduce
把结果继续和序列的下一个元素做累积计算:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)filter()
函数用于过滤序列。和map()
类似,filter()
也接收一个函数和一个序列。和map()
不同的是,filter()
把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素。注意到filter()
函数返回的是一个Iterator
,也就是一个惰性序列,所以要强迫filter()
完成计算结果,需要用list()
函数获得所有结果并返回list。sorted()
函数,还可以接收一个key
函数来实现自定义的排序,用sorted()
排序的关键在于实现一个映射函数。-
返回函数:函数作为返回值。这种称为“闭包(Closure)”:
-
返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
-
如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变
-
- 匿名函数:关键字
lambda
表示匿名函数,匿名函数有个限制,就是只能有一个表达式,不用写return
,返回值就是该表达式的结果。 - 装饰器:代码运行期间动态增加功能的方式
- 偏函数:
functools.partial
就是帮助我们创建一个偏函数的
- 模块和包
- 一个py文件就是一个module
- 包(package):按目录组织模块的方法
- 每一个包目录下面都会有一个
__init__.py
的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包 - 任何模块代码的第一个字符串都被视为模块的文档注释
- Anaconda,这是一个基于Python的数据处理和科学计算平台,它已经内置了许多非常有用的第三方库
- OOP
-
变量名类似
__xxx__
的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__
、__score__
这样的变量名。 -
有些时候,你会看到以一个下划线开头的实例变量名,比如
_name
,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。 -
双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问
__name
是因为Python解释器对外把__name
变量改成了_Student__name
,所以,仍然可以通过_Student__name
来访问__name
变量: -
判断对象类型:
type()
函数、types
模块中定义的常量、isinstance()、dir()
-
- 进程和线程
- 多进程:fork()、multiprocessing、Pool()、subprocess
- 进程间通信:Queue()、Pipes()
- 多线程:
- 任何进程默认就会启动一个线程,我们把该线程称为主线程(MainThread),主线程又可以启动新的线程(LoopThread)
- _thread(低级模块)、threading(高级模块)
current_thread()
函数,它永远返回当前线程的实例- 所有变量都由所有线程共享
- threading.Lock()、look.acquire()、look.release()
- ThreadLocal:一个
ThreadLocal
变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本,互不干扰。ThreadLocal
解决了参数在一个线程中各个函数之间互相传递的问题。
- 在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。
- 图形界面:第三方库:TK、wxWidgets、Qt、GTK
- virtualenv:用来为一个应用创建一套“隔离”的Python运行环境
- 异步IO
python笔记
最新推荐文章于 2024-09-09 23:28:21 发布