python 环境安装
下一个thonny
先用着,
在 mac 上安装 python, 就是用brew install python3
然后启动格式 python3
而不是 python
基本语法
print(), 字符串+, 但只能串和串, 这里和 int 这种数学的
+-*/%
** 幂
变量小写,不用声明, 用_
隔开.直接赋值好了, 定义多个变量用a,b,c=11,12,13
, 注意如果是 a=1,2
这个是 tuple. #是注释 “”” “””是块
变量
变量不用声明, 直接用. 有 int float bool string
有函数 function, tuple, list, dict
类 class 是 type
1 | print(type(a)) # 看类型 |
循环 while 和 for, 没有括号, 只有缩进
1 | while True: |
True, False. None
在 Python 中集合类型有 list、 tuple 、dict 和 set 等, 都能迭代.
1 | a = range(10) |
1 range(start, stop) [start, stop)
2 range(stop)
3 range(start, stop, step)
1 | list [] |
迭代器 __iter__
和 __next__
生成器 yield
跳出循环, pass, break, continue
1 | a=True |
if, if else 和 if elif
1 | if condition: |
没有 condition ? value1 : value2
三目操作符, 用:
1 | var = var1 if condition else var2 |
def 函数 是函数哦
1 | def function_name(parameters): |
return 可以返回多个值,以逗号分隔。相当于返回一个 tuple(定值表)。
return a,b,c # 相当于 return (a,b,c)
lambda
lambda 定义一个简单的函数,实现简化代码的功能,看代码会更好理解。
fun = lambda x,y : x+y
, 冒号前的 x,y 为自变量,冒号后 x+y 为具体运算。
1 | fun= lambda x,y:x+y |
map
map 是把函数和参数绑定在一起。一对一对.
1 | def fun(x,y): |
全局和局部, 同 javascript, 在函数中的就是局部
用 global
关键字在局部作用域中改这个全局同名变量
1 | APPLY = 100 # 全局变量 |
类 class
按变量, 函数的定义, 从 js 理解, 反正也是类. 没有 this 但有 self
1 | class Calculator: #首字母要大写,冒号不能缺 |
它的参数中有一个
self
,它是为了方便我们引用对象自身。方法的第一个参数必须是self
,无论是否用到。有关self
的内容会在下一讲展开
在定义方法时,必须有 self 这一参数。这个参数表示某个对象。对象拥有类的所有性质,那么我们可以通过 self,调用类属性。
这里有一个类属性 laugh。在方法 show_laugh()中,通过 self.laugh,调用了该属性的值。
还可以用相同的方式调用其它方法。方法 show_laugh(),在方法 laugh_100th 中()被调用。
通过对象可以修改类属性值。但这是危险的。类属性被所有同一类及其子类的对象共享。类属性值的改变会影响所有的对象
用 __init__()
初始化, 当然也可以放初始值.Python 会自动调用这个方法
1 | class Calculator: |
子类继承
1 | class Bird(object): # (括号中的object,当括号中为object时,说明这个类没有父类(到头了)) |
元组 Tuple 列表 List 统称为 sequence(序列)是一组有顺序的元素的集合
- tuple 元素不可变,list 元素可变
- 序列的引用
s[2]
,s[1:8:2]
- 字符串是一种 tuple
开始
或者说对象集合
tuple 和 list 的主要区别在于,一旦建立,tuple 的各个元素不可再变更,而 list 的各个元素可以再变更。
Tuple
叫做 tuple,用小括号、或者无括号来表述,是一连串有顺序的数字。
1 | a_tuple = (12, 3, 5, 15 , 6) |
字符串是一种特殊的 tuple, 因此可以执行元组的相关操作
List
而 list 是以中括号来命名的:
1 | a_list = [12, 3, 67, 7, 82] |
可以用 range() len()
range()
这个函数的功能是新建一个表。这个表的元素都是整数,从 0 开始,下一个元素比前一个大 1, 直到函数中所写的上限 (不包括该上限本身)
list 是一个类, 是 Python 已经定义好的一个类, 通过print(dir(list))
和 help 来查看, 有方法. 运算符都是特殊方法
序列都可以用[]来引用
还有见到用[:]
1 | 范围引用: 基本样式[下限:上限:步长] |
List
1 | 插入 |
多维列表 二维数组咯
创建二维列表
一个一维的 List 是线性的 List,多维 List 是一个平面的 List:
1 | a = [1,2,3,4,5] # 一行五列 |
list() 函数
拉链 zip
zip 函数接受任意多个(包括 0 个和 1 个)序列作为参数,合并后返回一个 tuple 的列表,请看示例:
1 | a=[1,2,3] |
字典, dict
对象?
1 | a_list = [1,2,3,4,5,6,7,8] |
模块安装
1 | 先安装 |
这里的 Numpy 和 matplotlib 都是外部模块, 需要安装以后才会有的. 他不属于 python 自带的模块.
import
1 | import time |
没有导出这, 直接就用
读写文件
写, 只读,写, 添加
1 | my_file=open('my file.txt','w') #用法: open('文件名','形式'), 其中形式有'w':write;'r':read. |
读, 所有文件, 按行读文件
1 | 一下读所有内容 |
input
1 | a_input=input('please input a number:') |
input 在判断中
1 | a_input=int(input('please input a number:'))#注意这里要定义一个整数型 |
错误处理 try except else finally
1 | try: |
id 看地址, copy, deepcopy
什么是 id?一个对象的 id 值在 CPython 解释器里就代表它在内存中的地址
1 | import copy |
当使用浅拷贝时,python 只是拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。看代码:
1 | import copy |
deepcopy 对外围和内部元素都进行了拷贝对象本身,而不是对象的引用。
1 | #copy.copy() |
总结
看成 2 块: 基本数据类型和序列, 函数, 面向对象, 循环和判断, 运算,
基本数据类型
- 变量不需要声明,不需要删除,可以直接回收适用。注意声明多个函数 a,b=1,2 和声明为 tuple a=1,2 当然可以在函数中 return 一个 tuple
- type(): 查询数据类型
- 有 None, int, float, bool, string. function, tuple, list, dict. 类 class 是 type. 都是对象, 就算是
a=1
也是引用, 不过是不可变数据对象, 可以当做 c 的值处理.
序列
- tuple 元素不可变,list 元素可变
- 字符串是一种 tuple
- 序列的引用 s[2], s[1:8:2]
运算
- 判断 ==, !=, >, >=, <, <=, in
- 数学 +, -, *, /, **, %
- 逻辑 and, or, not
- 类上的算特殊方法,当然有
[:]
缩进
- :冒号
- 4 个空格
循环
- range(start, stop, step), [)
- for 元素 in 序列:
- while 条件:
- continue
- break
- 利用 enumerate()函数,可以在每次循环中同时得到下标和元素:返回的是一个包含两个元素的定值表(tuple)
- zip, 如果你多个等长的序列,然后想要每次循环时从各个序列分别取出一个元素, 合并成一个 tuple,可以利用 zip()方便地实现, 聚合列表
函数, 函数也是对象哦
- 定义和 return
- 默认参数, 自调用, 关键参数(传递是根据每个参数的名字传递参数, 可以和常见的位置传参混用), 可变参数(包裹传递加 tuple, 包裹关键字传递\* dict. 定义的时候使用是 packeging, 函数调用的时候用和\*就是 unpackaging).
- lambda,
- map()的功能是将函数对象依次作用于表的每一个元素. map()的返回值是一个循环对象。可以利用
list()
函数,将该循环对象转换成表。 filter(func,[10,56,101,500])
通过读入的函数来筛选数据, filter 返回的不是表,而是循环对象。 reduce()函数
循环对象: 相对于序列,用循环对象的好处在于:不用在循环还没有开始的时候,就生成好要使用的元素。所使用的元素可以在循环过程中逐次生成。这样,节省了空间,提高了效率,编程更灵活
- 有一个
__next__()
方法, 这个方法的目的是进行到下一个结果,而在结束一系列结果之后,举出StopIteration
错误 - 迭代器: 从技术上来说,循环对象和 for 循环调用之间还有一个中间层,就是要将循环对象转换成迭代器(iterator)。这一转换是通过使用
iter()
函数实现的。但从逻辑层面上,常常可以忽略这一层,所以循环对象和迭代器常常相互指代对方。 - 生成器(generator)的主要目的是构成一个用户自定义的循环对象。 生成器表达式(Generator Expression)
G = (x for x in range(4))
- 表推导(list comprehension)是快速生成表的方法.
L = [x**2 for x in range(10)]
面向对象
将东西根据属性归类 ( 将 object 归为 class )
方法是一种属性,表示动作
用继承来说明父类-子类关系。子类自动具有父类的所有属性。
self 代表了根据类定义而创建的对象。这个参数表示某个对象。对象拥有类的所有性质,那么我们可以通过 self,调用类属性。
建立对一个对象: 对象名 = 类名()
引用对象的属性: object.attribute
通过 self 调用类属性__init__()
: 在建立对象时自动执行
类属性和对象的性质的区别
反过头来看看
- len() dir() help()
- 数据结构 list(列表)是一个类。
- 运算符是方法
字典也叫容器
- 类似对象但 key 可以是数字或布尔, map?
- 没有序列, 没有下标, 用 key
词典的每个元素是键值对。元素没有顺序。
1 | dic = {'tom':11, 'sam':57,'lily':100} |
文件
1 | f = open(name, "r") # f = open(文件名,模式) 创建文件对象 |
模块
- 通过
模块.对象
的方式来调用引入模块中的某个对象, (被引用的那个没有导出关键字, 就是普通的一个 py 文件)- 4 种 import
- Python 会在以下路径中搜索它想要寻找的模块:
- 标准库的安装路径
- 程序所在的文件夹
- 操作系统环境变量 PYTHONPATH 所包含的路径
- 模块包
import this_dir.module
引入 this_dir 文件夹中的 module 模块(文件)。- 该文件夹中必须包含一个init.py 的文件,提醒 Python,该文件夹为一个模块包。
__init__.py
可以是一个空文件。
特殊方法, python 中一切都是对象, 对象就有方法
dir()
来查看- 运算符是通过调用对象的特殊方法实现的
- 对于内置的对象来说(比如整数、表、字符串等),它们所需要的特殊方法都已经在Python中准备好了。而用户自己定义的对象也可以通过增加特殊方法,来实现自定义的语法。特殊方法比较靠近Python的底层,许多Python功能的实现都要依赖于特殊方法。我们将在以后看到更多的例子。