参考教程:菜鸟教程
https://www.runoob.com/python3/python3-tutorial.html
使用的开发工具是Jupyter Notebook(Anaconda)
下面我主要是介绍一些需要注意的点和练习过程:
说在前面:动手很重要
一、python基本语法
1.标识符规则:
在 Python 里,标识符由字母、数字、下划线组成。
在 Python 中,所有标识符可以包括英文、数字以及下划线(_),但不能以数字开头。
Python 中的标识符是区分大小写的。
注意:
以下划线开头的标识符是有特殊意义的。
以单下划线开头 _foo 的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 from xxx import * 而导入。
以双下划线开头的 __foo 代表类的私有成员,以双下划线开头和结尾的 __foo__ 代表 Python 里特殊方法专用的标识,如 __init__() 代表类的构造函数。
2.行和缩进
python中的代码块不适应大括号{ } 来控制类、函数以及其他逻辑判断。python对缩进是很敏感的,它通过缩进来判断函数或者模块。
if True:
print("true")
else:
print("false")
若出现: IndentationError: unindent does not match any outer indentation level错误表明是缩进错误
3.多行语句在行尾使用 来接下一行
句中包含 [], {} 或 () 括号就不需要使用多行连接符。
4.字符串表示 ‘’,“”,“““,三引号可以由多行组成。单行注释用 # 多行注释用三个单引号或三个双引号。
5.input、print表示输入、输出,python中的命令-h可以查看各参数的帮助信息。
6.import 与 from...import
二、Python变量类型
1.变量赋值
Python中变量名赋值不需要进行类型声明,变量名也不需要提前创建,变量赋值以后才会被创建(这一点和R语言类似)
2.多变量赋值
可以同时给三个变量赋相同的值,也可以将三个变量同时分别赋值。
3.标准数据类型
Python中有五个标准数据类型:Numbers(数字)、String(字符串)、List(列表)、Tuple(元组)、Dictionary(字典)
详细内容看下面的第九条
三、Python的基本数据类型
用于存储数据
1.Number数字
Python3 支持 int、float、bool、complex(复数)。
(1)内置的 type() 函数可以用来查询变量所指的对象类型。
(2)此外还可以用 isinstance 来判断
(1)(2)的区别在于:
(3)Python3 中,把 True 和 False 定义成关键字了,但它们的值还是 1 和 0,它们可以和数字相加。
(4)del语句可以删除一些对象引用。也可以删除单个或多个对象。
(5)Python还支持复数,复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型。
2.字符串
Python中的字符串用单引号 ' 或双引号 " 括起来,同时使用反斜杠 转义特殊字符。
(1)字符串截取:
变量[头下标:尾下标],字符串第一个字符索引是0;
从左往右以0开始,从右往左以-1开始。
(2)字符串操作
注意不能使用索引来改变字符串内的字符。
(3)对转义字符的说明
反斜杠()转义特殊字符,如果你不想让反斜杠发生转义,可以在字符串前面添加一个 r,表示原始字符串:
3.列表List(Python内还有一些对列表操作的函数)
(1)列表是写在方括号 [] 之间、用逗号分隔开的元素列表, 列表中元素的类型可以不相同。
(2)列表中元素的截取
①当只截取一个时,返回值是这个元素;当截取多个时,返回的是一个新的列表。
②注意选取范围是左闭右开区间
索引值以 0 为开始值,-1 为从末尾的开始位置。
可以直接通过索引来更改列表内元素,也可以通过列表内置方法来更改。
③注意:
list可以用+进行拼接
和字符串一样,list可以被索引和切片
python截取列表数据时,可以接收第三个参数,实现按步数截取。
当第三个参数为负数时逆向读取,可以用来翻转字符串。
4.元组Tuple
(1)特点:操作元组与列表类似,不同之处在于,元组内的元组不能修改,元组写在小括号()里,元组之间用逗号隔开,元组内的元组类型也可以不同。元组之间也可以通过+直接合并。
(2)虽然tuple的元素不可变,但是他可以包含可变的对象,比如说list列表。
(3)特别注意:构造包含0或1个元素的元组有着特殊的语法规则
5.集合set
是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员。
基本功能是进行成员关系测试和删除重复元素。set里的内容位置是随意的,所以不能用索引列出
(1)set的创建
①可以使用大括号{}或者set()函数来创建
②在用set函数的时候,注意,set函数最多只能接收一个参数
那么怎样用它来创建含有多个元素的集合呢?
向set函数的参数里,传入含有多个元素的列表或元组均可;如果只传入一个字符串,他会将字符串拆成一个个的字符,那么创建的集合就全是一个个的字母的集合啦
③空的集合必须通过set()函数来创建;{}是用来创建空的字典的。
(2)集合之间可以进行运算,差、交、并、补等
(3)set的使用:
①去重,set自动完成
②判断元素是否在集合中
6.字典dictionary(具体字典内置函数,可以百度一下)
列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
(1)字典的实质:字典是一种映射类型,字典用 { } 标识,它是一个无序的 键(key) : 值(value) 的集合。
(2)注意: 键(key)必须使用不可变类型, 在同一个字典中,键(key)必须是唯一的。
(3)创建字典:三种方式对比
创建空字典用{}。
(4)对字典的读取操作
7.Python数据转换
下面介绍几个内置函数可以执行数据类型之间转换,这些函数返回一个新的对象值,表示转换的值。
函数 |
描述 |
int(x) |
将x转化为一个整数 |
float(x) |
将x转化为浮点数 |
comlext(real,imag) |
创建复数 |
str(x) |
将对象x转化为字符串 |
repe(x) |
将对象x转化为表达式字符串 |
tuple(s) |
将序列s转化为元组 |
list(s) |
将序列s转化为列表 |
set(s) |
将s转化为可变集合 |
frozenset(s) |
转化为不可变集合 |
dict(d) |
将d转化为字典;d必须是一个(key,value)的元组序列 |
chr(x) |
将一个整数转化为字符 |
ord(x) |
将一个字符转化为整数 |
hex(x) |
将x转化为16进制形式字符串 |
oct(x) |
转化为八进制形式字符串 |
四、Python解释器
现在Python的集成开发工具多种多样,我现在使用的是Jupyter notebook,网页版,高效方便。
也可以使用python自带的IDE,有脚本编程和交互式编程两种。
还有pycharm、Ipython等工具都很方便。
五、Python运算符(这里只讲一些常用的)
1.算术运算符
运算符 |
描述 |
+,-,*,/ |
加减乘除 |
% |
取模,返回除法的余数 |
x**y |
返回x的y次方结果 |
// |
向下取接近除数的整数,9//2=4;-5//2=-3;得到的是更小的整数 |
2.比较运算符(返回的是真值)
运算符 |
描述 |
==、!= |
等于、不等 |
>、<、>=、<= |
大于、小于、大于等于、小于等于 |
3.赋值运算符
运算符 |
描述 |
= |
简单赋值符 c = a + b 将 a + b 的运算结果赋值为 c |
+=、-=、*=、/= |
加减乘除赋值符 c += a 等效于 c = c + a |
%= |
取模赋值符 c %= a 等效于 c = c % a |
**= |
幂赋值符 c **= a 等效于 c = c ** a |
//= |
取整除赋值符 c //= a 等效于 c = c// a |
:= |
海象运算符(和R语言中的有点类似) 可在表达式内部为变量赋值。 |
4.位运算符
运算符 |
描述 |
& |
按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 |
| |
按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 |
^ |
按位异或运算符:当两对应的二进位相异时,结果为1 |
~ |
按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1。~x 类似于 -x-1 |
<< |
左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 |
>> |
右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数 |
5.逻辑运算符(看X的真值)
运算符 |
描述 |
and |
与运算符:如果x为False,x and y 返回 False,否则返回y的计算值 |
or |
或运算符:如果x是True,返回x的值,否则返回y的值 |
not |
非运算符,如果x为True,则返回False,否则返回True |
6.成员运算符
in、not in
7.身份运算符(判断)
is 判断两个标识符是否引用自同一个对象
is not 判断两个标识符是否引自不同的对象
8.Python运算符的优先级
"**" > "~ +@ -@" > "*/%//" > "+-" > "<< >>"
注意:python3已经不支持<>(不等)运算符,被!=替代了。
六、Python条件控制
1.if判断
(1)小例子:
(2)if嵌套
if 表达式1:
语句
if 表达式2:
语句
elif 表达式3:
语句
else:
语句
elif 表达式4:
语句
else:
语句
七、Python循环语句
1.while循环语句
while(condition):
statement
例子:
当条件永真时,会无限循环
当条件不成立时跳出循环,也可以用break来终止循环
2.for循环语句
(1)一般格式
for var in sequence:
statemnet1
else:
statement2
(2)小例子(range函数也可以指定步数,默认是整数 1)
3.continue关键字
从例子中就可以看出,continue是执行到该语句时,下面的语句不再执行,继续执行下一个循环过程。
八、Python 迭代器和生成器
1.迭代器: 可以记住遍历的位置的对象。
迭代是Python最强大的功能之一,是访问集合元素的一种方式。
迭代器有两个基本的方法:iter() 和 next()。
(1)使用Python内置迭代器
例子:
(2)迭代
(3)对自定义的类使用迭代器
把一个类作为一个迭代器使用需要在类中实现两个方法:__iter__(),__next__() ※注意是双下划线!!!!
① __iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过触发 StopIteration 异常标识迭代的完成(目的就是识别循环结束的情况,防止出现无限循环的情况)。
② __next__() 方法会返回下一个迭代器对象。
③小例子:
更加合理的指定迭代范围的方式:
2.生成器generator:生成器就是一个迭代器
(1)定义:使用了yield的函数被称为生成器
调用一个生成器函数,返回的是一个迭代器对象。
(2)生成器的工作流程:
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值(相当于一个断点), 并在下一次执行 next() 方法时从当前位置继续运行。
小例子:使用yield实现斐波那契数列:
九、Python函数
1.定义一个函数
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
函数内容以冒号起始,并且缩进。
return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。
2.调用函数
直接使用函数标识符(加需要传递的参数)进行调用
3.参数传递
(1)明确一下Python里的可更改和不可更改对象
string、tuple、number都是不可更改对象;而list、dict是可更改对象
下面的概念好好理解:
不可变类型: 变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。
可变类型: 变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
(2)对于不可变类型、可变类型对象在调用函数中作为参数传递:
不可变类型( string、tuple、number等):类似于C++的值传递;如func(a),a传入的只是a的值,并不影响原来a对象本身。比如在函数内部对a的值改变,改变的只是这个对象的复制对象,对象a本身是不变的。
可变类型(list、dict等):类似于C++的引用传递,如func(la),la传入的是这个对象本身,函数内部对这个对象修改后,外部的对象是会被改变的。
4.参数类型
调用参数时可使用的正式参数类型:
必需参数、关键字参数、默认参数、不定长参数
(1)必需参数: 必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
(2)关键字参数: 使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
例:
(3)默认参数
调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值:
接上面例子:
(4)不定长参数
你可能需要一个函数能处理比当初声明时更多的参数。
①第一种形式:使用加*的参数,表示输入一个元组,这个元组的长度是不定的,由调用函数时,自动读取。
例:
②第二种形式:使用加**的参数,表示输入形式为字典形式,长度不定
例:
5.匿名函数
python 使用 lambda 来创建匿名函数。 lambda的主体是一个表达式,而不是一个代码块。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
(1)语法:注意写lambda表达式时参数部分不要加 [ ] 这个符号只是代表可以省略 ,不然会报错
(2)例:
可以看出,也可以不指定参数
十、Python数据结构
1.列表
2.列表——>堆栈
3. 元组和序列
4.集合
5.字典