本系列是学习 廖雪峰 Python3 教程 过程中记录的笔记,本篇文章内容主要包括 Python
的基础知识、函数、高级数据结构(List
, Tuple
, Dict
, Set
)。
Python 解释器类型
- CPython 应用最为广泛,C语言开发,提示符是
>>>
; - IPython 交互式解释器,提示符是
In [序号]:
; - PyPy 执行速度快,与上两种有较大的差异;
- Jython 可将 Python 代码编译成 Java 平台所需的字节码;
- IronPython 可将 Python 代码编译成微软 .Net 平台所需的字节码;
Python 基础
本部分主要是 Python 的一些入门的基础知识,有语言基础的看起来不费力。
输入输出
print(strA, strB)
中遇到逗号会自动转换为空格输出,前后两个字符串会连在一起;input_str = input("str_prompt")
可以加一些输入提示语,增强交互性,输入的字符全部是str
类型;
input_str = input("please input your data:")
print(type(input_str))
数据类型
- 整数:任意大小,没有限制;
- 浮点数:任意大小,没有限制,过大过小的数必须使用科学计数法来表示,
0.000012
可以表示为1.2e-5
; - 字符串:‘’ 或者 “” ,了解转义字符 \ ,\n 换行 \t 制表位(相当于 tab);
- 布尔值:
True
和False
两种,区分大小写,支持and
or
和not
运算; - 空值:
None
表示,一个特殊的存在; - 变量:大小写英文、数字和
_
的组合,且不能使用数字开头。本身类型不固定,属于动态语言; - 常量:值不变,通常用全部大写的变量名来表示,例如:
PI = 3.14159265359
;
字符编码
- ASCII 只有 127 个字符,大小写英文字母、数字和一些符号;
- Unicode 实现所有语言的统一表示。用于内存、服务器中;
- UTF-8 在 Unicode 的基础上,根据字符的使用频率动态编码。用于存储和传输;
encode()
可以将Unicode
编码为指定的字节;
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('gb2312')
b'\xd6\xd0\xce\xc4'
- 格式化字符串匹配:
%
或者 format();%d
整数%f
浮点数%s
字符串%x
十六进制整数;format()
使用占位符{}
来控制,在需要格式化的占位符较多时使用,会条理一些;
>>> 'growth rate: %d %%' % 7
'growth rate: 7 %'
>>> 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
'Hello, 小明, 成绩提升了 17.1%'
内置函数
-
abs(x)
返回 x 的绝对值; -
max(list_data)
返回list_data
中的最大值; - 数据类型转换:
int(x)
,float(x)
,str(x)
,bool(x)
;
高级数据结构
List
链表,有序,链式存储一系列元素,通过唯一索引来访问,元素的类型可以不一致,list
可以多层嵌套。
- 初始化:
list()
或者[]
;
classmates = ['Michael', 'Bob', 'Tracy']
list.append()
在末尾添加元素;
classmates.append('Adam')
list.pop()
删除末尾的元素;list.pop(index)
删除指定索引的元素;list.insert(index, value)
在指定索引处插入特定的值;
classmates.insert(1, 'Jack')
list[index] = new_value
访问、修改指定位置的值;
Tuple
链表,有序,与 List
类似,但是初始化后就不可以修改,可以嵌套,有利于代码安全。
- 初始化:
tuple()
或者()
;
classmates = ('Michael', 'Bob', 'Tracy')
classmates = tuple(['Michael', 'Bob', 'Tracy'])
- 不能修改指的是每个元素的指向不会修改,在多层嵌套中,嵌套内部的元素还是可以改变的。
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
- 定义空的
tuple
:t = ()
; - 定义只有一个元素的
tuple
:t = (1,)
;
Dict
字典,无序,存放 key-value
,有些语言中称为 map
,将 key
按照 Hash
计算存放位置,可实现快速查找,但是内存消耗比较大,算是用空间换取时间。其中,key
不能修改,重复时会被后者覆盖 value
。
- 初始化:
dict()
或者{}
:
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
- 访问及添加:
d['Adam'] = 67
- 判断
key
是否存在——in
或者使用get()
方法(设定-1为不存在时的返回值):
if 'Thomas' in d
d.get('Thomas', -1)
Set
集合,无序,只存放 key
, 重复的元素会被自动过滤。
- 初始化:
set()
:
s = set([1, 2, 3])
s.add(key)
添加元素;s.remove(key)
删除元素;
Tips
- 常在
.py
文件开头表明该文件类型和文件编码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
pass
可作为占位符,消除程序的语法错误;
if age >= 18:
pass
Python
函数返回多值其实是返回一个tuple
;- 函数定义——默认参数,默认参数必须指向不变对象!
def add_end(L=[]):
L.append('END')
return L
>>> add_end()
['END']
>>> add_end()
['END', 'END']
Python 函数在定义的时候,默认参数L
的值就被计算出来了,即[]
,因为默认参数 L
也是一个变量,它指向对象[]
,每次调用该函数,如果改变了 L
的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]
了。
- 函数定义——可变参数,
*args
是可变参数,args 接收的是一个 tuple ; - 函数定义——关键字参数,
**kw
是关键字参数,kw 接收的是一个 dict ; - 使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。