本系列是学习 廖雪峰 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);
  • 布尔值:TrueFalse 两种,区分大小写,支持 and ornot 运算;
  • 空值:None 表示,一个特殊的存在;
  • 变量:大小写英文、数字和 _ 的组合,且不能使用数字开头。本身类型不固定,属于动态语言;
  • 常量:值不变,通常用全部大写的变量名来表示,例如:PI = 3.14159265359 ;

字符编码

  • ASCII  只有 127 个字符,大小写英文字母、数字和一些符号;
  • Unicode 实现所有语言的统一表示。用于内存、服务器中;
  • UTF-8Unicode 的基础上,根据字符的使用频率动态编码。用于存储和传输;
  • 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标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。