廖雪峰python学习笔记
学习网站https://www.liaoxuefeng.com/wiki/1016959663602400/
- python的好处
可以做网站,很多著名的网站包括YouTube就是Python写的;可以做网络游戏的后台,很多在线游戏的后台都是Python开发的 - python不能做的
写操作系统,这个只能用C语言写;写手机应用,只能用Swift/Objective-C(针对iPhone)和Java(针对Android);写3D游戏,最好用C或C++。 - python的缺点
运行速度慢;代码不能加密
Python解释器
- CPython是用c语言开发的解释器,在命令行下运行python就是启动CPython解释器。
- IPython是基于CPython之上的一个交互式解释器。
- PyPy是另一个Python解释器,可以提高执行速度。
还有Jython和IronPython
python 基础
输入输出
name = input()
name = input('please enter your name')
print('hello', name)
数据类型和变量
- 整数:可以在数字中间以_分隔,写成10_000_000_000和10000000000一样
- 交互式输入允许用
'''...'''
的格式表示多行内容; - r代表不将字符串里面的转义
- 静态语言定义时必须指定类型比如java,而动态语言不需要指定类型比如python
- 把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据。
- a = ‘ABC’ :在内存中创建了一个’ABC’的字符串;在内存中创建了一个名为a的变量,并把它指向’ABC’。
字符串和编码
- ASCII编码是1个字节(8位),而Unicode编码通常是2个字节。
如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节,从而节省空间。由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes(bytes的每个字符都只占用一个字节)。
x = b'ABC'
- ord()函数获取一个字符的整数表示
- chr()函数把编码转换为对应的字符
- 以Unicode表示的str通过.encode(‘utf-8’)方法可以编码为指定的bytes,反之.decode(‘utf-8’,errors=‘ignore’)
文件开头通常要写
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
- 格式化方式
# % (%%代表转义的%)
>>>'Age: %s. Gender: %s' % (25, True)
# format()
>>>'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
#f-string()
>>> r = 2.5
>>> s = 3.14 * r ** 2
>>> print(f'The area of a circle with radius {
r} is {
s:.2f}')
list和tuple
- list 用[]初始化
.append()
.insert(1, ‘Jack’) 向索引1插入
.pop()或者.pop(i)
.sort() - tuple 用()初始化,不能修改元素的指向,比list更安全,但只有一个元素的时候应该加逗号(1,)
dict和set
- dict
in或者get(key)判断key在不在,pop(key)删除key
>>> d.get('Thomas')
>>> d.get('Thomas', -1)
- set
list初始化,add(),remove()
del删除的是变量,而不是数据
函数
- 函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量
- 数据类型检查可以用内置函数isinstance()实现
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
- 返回多个值其实是返回一个tuple
- 默认参数必须指向不变对象,比如说None
可变参数:
*nums表示把nums这个list的所有元素作为可变参数传进去关键字参数:
**extra表示把extra这个dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict,注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra。
高级特性
- 只写[:]就可以原样复制一个list,浅拷贝
- 循环的重点在于
可迭代对象
,通过collections模块的Iterable类型判断
>>> from collections import Iterable
>>> isinstance('abc', Iterable)
True
>>> isinstance([1,2,3], Iterable)
True
>>> isinstance(123, Iterable)
False
# list、dict、str虽然是Iterable,却不是Iterator。
# 因为Iterator可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数。
>>> from collections.abc import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({
}, Iterator)
False
>>> isinstance('abc', Iterator)
False
# 把list、dict、str等Iterable变成Iterator可以使用iter()函数
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
- 生成器: 在循环的过程中不断推算出后续的元素,不必创建完整的list,从而节省大量的空间,生成器也是可迭代对象
# 方法一:将列表生成器的[]改成(), 可以通过next(g)获得generator的下一个返回值,直到最后抛出StopIteration错误表示无法继续返回下一个值
# 但是一般不用next,直接通过for循环
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>
# 方法二:如果一个函数定义中包含yield关键字,那么这个函数就不是普通函数,而是一个generator
# 变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b # print(b)就可以打印出b
a, b = b, a + b
n = n + 1
return 'done'
# eg:杨辉三角
def triangles(max):
n = 0
L = [1]
while n < max: #设置生成器
yield L
L = [L[i] + L[i + 1 ] for i in range(len(L) - 1 ) ]
L.insert(0, 1)
L.append(1