python相关的基础代码位于Gitee的https://gitee.com/yangsx95/notes-python中。
搭建Python环境
windows下的python环境
前往官网下载对应的python安装包,一路安装即可。
注意
在安装过程中会有选项,是否添加到环境变量中,勾选即可自动将python添加到环境变量中。
安装完成后,可以使用命令python
检测是否安装成功。
如果你是用的是压缩版本,需要手动配置path环境变量, 直接将根路径设置到Path中即可。
集成开发环境选择
- 使用文本编辑器开发,然后通过
python 文件名
来运行 - Pycharm,Jetbrains,笔者正在使用的一款开发环境
- Aptana Studio,基于Eclipse基础上进行插件集改支持python开发
- 使用IDEA或者Eclipse集成插件
检测python的版本
python -V #注意V大写
Python 3.6.2
Hello World
print("Hello World");
使用python
命令打开shell交互式解释器, 输入代码即可运行。
python命令参数:
选项 | 参数 |
---|---|
-d | debug 解析时显示调试信息 |
-O | 生成优化代码 .pyo 文件 |
-S | 启动时不引入查找Python路径的位置 |
-V | 输出Python版本号 |
从 1.6版本之后基于内建的异常(仅仅用于字符串)已过时 | |
-c cmd | 执行 Python 脚本,并将运行结果作为 cmd 字符串 |
file | 生成优化代码 .pyo 文件 |
-h | 帮助 |
创建一个后缀为py的源码文件,使用python HelloWorld.py 运行python文件
交互式编程
我们可以在命令提示符中输入"Python"命令来启动Python解释器
脚本式编程
可以通过如下命令运行python脚本:
python hello.py
编码
Python3源码默认以UTF-8为编码,所有字符串都是Unicode字符串。如果要切换编码,可以在源文件中指定:
# -*- coding: cp-1252 -*-
标识符(变量命名规则)
- 不可使用保留字
- 首字符必须是字母或者下划线
- 其他字符可以有字母下划线和数字组成
- 大小写敏感
规则和Java相同
保留字
python提供了 keyword模块,可以列举出当前版本的所有保留字:
>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
注释
单行注释: #
sharp开头。
多行注释: 多个#
开头,或者使用 ''' '''
或者 """ """
# 我是注释
'''
我是多行注释
'''
"""
我是多行注释
"""
可选的分号
在语句结束时,可以使用换行表示语句结束,可以替代分号。
行与缩进
- python不需要大括号
- 使用缩进表示代码块
- 同一个代码块,缩进必须相同
- 如果缩进不同,会抛出错误:
IndentationError: unindent does not match any outer indentation level
if True:
print("Answer")
print("True")
else:
print("Answer")
print("False")
代码组
缩进相同的一组语句构成一个代码块,我们称之代码组。
if expression :
suite
elif expression :
suite
else :
suite
多行语句
如果语句过长,我们可以使用反斜杠来实现多行语句:
total = item_one + \
item_two + \
item_three
如果语句包含{}
,[]
,()
则不需要反斜杠,比如如下数组:
total = ['item_one', 'item_two', 'item_three',
'item_four', 'item_five']
同一行显示多个语句
一行使用多个语句,需要;
分号分割:
i: int = 100; j = 100; k:int = 100
空行
函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。
空行与代码缩进不同,空行并不是Python语法的一部分。书写时不插入空行,Python解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。
记住:空行也是程序代码的一部分。
使用import导入模块
导入整个模块 moduleA: import moduleA
导入模块 moduleA 的函数 funA: from moduleA import funA
导入模块 moduleA 的多个函数: from moduleA import funA, funB, funC
导入模块 moduleA 的所有函数: from moduleA import *
控制台输出与输入函数
#换行输出
print("输出")
#不换行输出,指定输出结尾为字符串空格
print("不换行输出", end=" ")
# 打印多个字符串
print ('The quick brown fox', 'jumps over', 'the lazy dog')
input("\n\n按下 enter 键后退出。") #输入
sys.argv 可以获取启动脚本时的输入参数,比如有如下HelloWorld.py
:
import sys
print(sys.argv)
使用命令 python HelloWorld.py name Lisi
运行,会打印:
['C:/Users/Feathers/PycharmProjects/learning/HelloWorld.py', 'name', 'Lisi']
变量和数据类型
变量
变量的定义和赋值:
# 变量的定义
# 定义变量a,类型为int。这里会判断赋值类型,从而确定变量类型
a = 1
# 定义变量b,类型为float。使用冒号空格指定类型
b: float = 10.0
c: complex = 10
# 定义多个变量,并赋值
d, e, f = "a", 1, 1.8
# 定义多个变量并赋相同的值
g = h = i = 2
变量的销毁:
# del var1[,var2[,var3[....,varN]]]]
del a, b, c
print(a) # NameError: name 'a' is not defined
创建过程
当我们写:a = ‘ABC’时,Python解释器干了两件事情:
- 在内存中创建了一个’ABC’的字符串;
- 在内存中创建了一个名为a的变量,并把它指向’ABC’。
和Java类似。
标准数据类型
在python3中,公有六种标准的数据类型:
- Number 数字
- String 字符串
- List 列表
- Tuple 元组
- Set 集合
- Dictionary 字典
其中,Number String Tuple 是不可变数据
List Dictionary Set 是可变数据
type函数:查询变量的类型
a, b, c, d = 1, 1.0, 3e5j, "str"
print(type(a), type(b), type(c), type(d))
# <class 'int'> <class 'float'> <class 'complex'> <class 'str'>
instance函数:判断变量类型
print(isinstance(a, int)) // 会认为字类是一种父类类型
# True
None
用None
表示。None不能理解为0,相当于其他语言中的NULL。
print(type(None)) # <class 'NoneType'>
Number
int
长整形float
浮点型bool
布尔类型complex
复数类型
int
在 python3中没有短整型,只有长整形,长整形使用int来表示。
各个进制的表示形式:
进制 | 表示 | 对应十进制的值 | 转换为此进制的方式 |
---|---|---|---|
二进制 | 0b100 | 4 | bin(任意进制数) |
八进制 | 0o100 | 64 | oct(任意进制数) |
十六进制 | 0x100 | 256 | hex(任意进制数) |
float
浮点数就是小数:1.2
, 2.50
,-0.58
等
对于很小的浮点数,使用e替代10,即1.29e3
就是 1290
整数永远是精确的 而 浮点数永远会有四舍五入的误差。
整数与浮点数运算为浮点数。
bool
一个布尔值只有True
、False
两种值,在内部中使用1 和 0 存储。
所以,bool类型也是Number类型,也可以进行数值运算。
print(50 + True) # 51
短路运算:布尔值可以用and
、or
和not
运算,分别对应与、或、非,并且是短路运算符。
注意:Python把0
、空字符串
‘和None
看成 False
,其他数值和非空字符串都看成 True
String
字符串是以''
或""括起来的任意文本,比如'abc'
,"xyz"
等等。请注意,''
或""
本身只是一种表示方式,不是字符串的一部分,因此,字符串'abc'
只有a,b,c这3个字符。
- 如果字符串本身包含
'
,比如我们要表示字符串 I’m OK ,这时,可以用" "括起来表示:"I'm OK"
- 类似的,如果字符串包含
"
,我们就可以用' '
括起来表示:'Learn "Python" in imooc'
- 如果既包含
""
,又包含''
,可以使用\
转义字符。
注意:python字符串不可变
String在Python中公有三种表现形式:
s1 = '字符串1'
s2 = "字符串2"
s3 = '''字符串3
我是多行文本字符串
'''
字符串截取
字符串和java一样,是从第0个下表开始的。
s = 'abcdefg'
print(s[0:3]) # abc 输出前三个字符
print(s[0:-1]) # abcdef 输出第一个到倒数第二个字符
print(s[0]) # a 输出第0个字符
print(s[1:]) # bcdefg 输出第一个字符到最后一个字符
print(s[-2:]) # fg 输出最后两个字符
字符串连接操作
print (str + "TEST") # 连接字符串
不转移标识
python字符串中如果想禁用转义字符,可以使用如下方式:
s = r"\测试"
print(s) # \测试
# 同样适用于 ' 和 '''
其他
print (str * 2) # 输出字符串两次
List
- List是一种有序集合,可以添加和删除其中的元素
- Python 是一种动态语言,所以List集合中的元素的类型可以不相同:例如,
[10,"Python","test",17.7]
list = ['Adam', 95.5, 'Lisa', 85, 'Bart', 59] #定义一个List集合
print list # 输出该集合
['Adam', 95.5, 'Lisa', 85, 'Bart', 59]
-
空list:
list = []
-
按照索引来访问list
list = ['Adam', 95.5, 'Lisa', 85, 'Bart', 59] print list[3] #根据索引获取元素,不可越界IndexError 88
-
倒叙访问list,-1索引表示倒数第一个元素,-2表示倒数第二个元素,以此类推
list = ['Adam', 95.5, 'Lisa', 85, 'Bart', 59] print list[-3] #根据索引获取元素,不可越界IndexError 88
-
向List尾部添加元素 使用
list.append()
方法list = ['Adam', 95.5, 'Lisa', 85, 'Bart', 59] list.append("Jack") print list ['Adam', 95.5, 'Lisa', 85, 'Bart', 59, 'Jack']
-
向List指定位置添加元素 使用
list.insert()
方法list = ['Adam', 95.5, 'Lisa', 85, 'Bart', 59] list.insert(0,"Jack") list ['Jack', 'Adam', 95.5, 'Lisa', 85, 'Bart', 59]
-
从list中删除元素 使用
list.pop()
方法,该方法返回被删除的元素list = ['Adam', 95.5, 'Lisa', 85, 'Bart', 59] list.pop() #不指定参数,默认删除尾元素 59 list ['Adam', 95.5, 'Lisa', 85, 'Bart'] list.pop(0) #指定参数,删除指定索引处的元素 'Adam' list [95.5, 'Lisa', 85, 'Bart']
-
替换元素
list = ['Adam', 95.5, 'Lisa', 85, 'Bart', 59] list[0] = "Jack" list ['Jack', 95.5, 'Lisa', 85, 'Bart', 59] list[-1] = 60 list ['Jack', 95.5, 'Lisa', 85, 'Bart', 60]
Tuple
-
元组,和List非常相似,但一旦创建了,Tuple就无法修改了
tuple = ('Adam', 95.5, 'Lisa', 85, 'Bart', 59) #和List不同 使用了()代替了[] print tuple ('Adam', 95.5, 'Lisa', 85, 'Bart', 59) print tuple[-1] 59 print tuple[2] Lisa
-
空Tuple:
tuple = ()
-
单元素Tuple
tuple = ("d") #解释器默认将()解释为强制类型转换 这样代码就成了 tuple = "d" tuple 'd' tuple = ("d",) #多加一个,避免歧义 tuple ('d',)
-
可变Tuple
tuple = ("d","dsds",["dsfds",25]) list = tuple[-1] list.append("555555") tuple ('d', 'dsds', ['dsfds', 25, '555555'])
Dict:
字典,字典中的字可以根据对应的信息查到,Dict类似
一种键值对类型
Dict的特点
-
Dict的查找速度与元素数量无关,查找速度快,而List会随着元素数量的增加速度也会变慢
-
Dict相对于其他集合占用空间大,而List恰恰相反
-
Dict是无序的打印顺序不是创建顺序,不可以用dict存储有序集合
-
他的元素key,是不可变的,字符串,浮点数,整型都可以作为dict的key
-
创建dict
>>> d = { ... 'a':1, ... 'b':2 ... } print d {'a': 1, 'b': 2} #len()函数可以用来计算集合的长度 len(d) 2
-
根据key获取value
第一种 方法:
# 判断是否有这个key,避免KeyError
if 'b' in d:
... print d['b']
...
2
第二种方法
#使用dict的get()方法,根据key获得value,如果不存在该key,则返回None
print d.get('d')
None
-
更新Dict
d['b'] = 22 print d {'a': 1, 'b': 22}
-
遍历Dict,注意,只能取到value的数值
for key in d: ... print key ... a b
Set
set的特点:
-
没有重复
-
无序性
-
内部结构和Dict类似,但是不存储value,所以查询速度也很快
-
对象不可变,可用于存储常量
-
创建Set
调用set()方法,并传入一个List>>> s = set(['a','b', 'c']) >>> print s set(['a', 'c', 'b'])#该set元素无序
-
传入含有重复元素的List,会自动去除重复元素
s = set(['a','b', 'c','a','a']) print s set(['a', 'c', 'b'])
-
访问Set
'a' in s True 'A' in s False
-
遍历Set
for x in s: ... print x ... a b
-
添加元素
s.add('c')#如果add的元素在set中已经存在,则什么也不做 print s set(['a', 'c', 'b'])
-
删除元素
s.remove('a')#如果remove的元素不存在,则会报错KeyError print s set(['c', 'b'])
运算符
算术运算符
运算符 | 描述 | 实例 |
---|---|---|
+ | 加 – 两个对象相加 | a + b 输出结果 31 |
– | 减 – 得到负数或是一个数减去另一个数 | a – b 输出结果 -11 |
* | 乘 – 两个数相乘或是返回一个被重复若干次的字符串 | a * b 输出结果 210 |
/ | 除 – x 除以 y | b / a 输出结果 2.1 |
% | 取模 – 返回除法的余数 | b % a 输出结果 1 |
** | 幂 – 返回x的y次幂 | a**b 为10的21次方 |
// | 取整除 – 返回商的整数部分 | 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0 |
比较运算符
运算符 | 描述 | 实例 |
---|---|---|
== | 等于 – 比较对象是否相等 | (a == b) 返回 False。 |
!= | 不等于 – 比较两个对象是否不相等 | (a != b) 返回 True。 |
> | 大于 – 返回x是否大于y | (a > b) 返回 False。 |
< | 小于 – 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。 | (a < b) 返回 True。 |
>= | 大于等于 – 返回x是否大于等于y。 | (a >= b) 返回 False。 |
<= | 小于等于 – 返回x是否小于等于y。 | (a <= b) 返回 True。 |
赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符 | 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 |
%= | 取模赋值运算符 | c %= a 等效于 c = c % a |
**= | 幂赋值运算符 | c = a 等效于 c = c a |
//= | 取整除赋值运算符 | c //= a 等效于 c = c // a |
位运算符
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 | (a & b) 输出结果 12 ,二进制解释: 0000 1100 |
| | 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 | (a | b) 输出结果 61 ,二进制解释: 0011 1101 |
^ | 按位异或运算符:当两对应的二进位相异时,结果为1 | (a ^ b) 输出结果 49 ,二进制解释: 0011 0001 |
~ | 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1。~x类似于 -x-1 | (~a ) 输出结果 -61 ,二进制解释: 1100 0011, 在一个有符号二进制数的补码形式。 |
<< | 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 | a << 2 输出结果 240 ,二进制解释: 1111 0000 |
>> | 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数 | a >> 2 输出结果 15 ,二进制解释: 0000 1111 |
逻辑运算符(短路)
运算符 | 逻辑表达式 | 描述 | 实例 |
---|---|---|---|
and | x and y | 布尔"与" – 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。 | (a and b) 返回 20。 |
or | x or y | 布尔"或" – 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。 | (a or b) 返回 10。 |
not | not x | 布尔"非" – 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 | not(a and b) 返回 False |
成员运算符
运算符 | 描述 | 实例 |
---|---|---|
in | 如果在指定的序列中找到值返回 True,否则返回 False。 | x 在 y 序列中 , 如果 x 在 y 序列中返回 True。 |
not in | 如果在指定的序列中没有找到值返回 True,否则返回 False。 | x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。 |
身份运算符
运算符 | 描述 | 实例 |
---|---|---|
is | is 是判断两个标识符是不是引用自一个对象 | x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False |
is not | is not 是判断两个标识符是不是引用自不同对象 | x is not y , 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False。 |
is 比较引用的地址,==比较值。
运算符优先级
运算符 | 描述 |
---|---|
** | 指数 (最高优先级) |
~ + – | 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@) |
* / % // | 乘,除,取模和取整除 |
+ – | 加法减法 |
>> << | 右移,左移运算符 |
& | 位 ‘AND’ |
^ | | 位运算符 |
<= < > >= | 比较运算符 |
<> == != | 等于运算符 |
= %= /= //= -= += *= **= | 赋值运算符 |
is is not | 身份运算符 |
in not in | 成员运算符 |
and or not | 逻辑运算符 |
条件判断和循环
Python 代码缩进规则
- 具有相同缩进的行代码,将被视作一个代码块。
if 条件语句
>>> if score == 100:
... print "you score is very good"
... elif score > 80:
... print "you score is good",score
... else:
... print "not good"
...
you score is good 85
for循环语句
list = ['Adam', 95.5, 'Lisa', 85, 'Bart', 59]
>>> for child in list: #child的含义:依次取出list中的元素并赋值给child,让child做出处理(在缩进的代码块中)
... print child
...
Adam
95.5
Lisa
85
Bart
59
遍历tuple类似。
while循环
n = 10
x = 1
while x < n:
print x
x = x+1
拥有break和continue。
支持多重循环
for x in ['a','b','c']:
... for y in ['1','2','3']:
... print x + y
输出结果为
a1、a2、a3、b1、b2、b3、c1、c2、c3
函数
查看帮助信息
- 官方文档地址: 行内式链接
- 使用
help(abs)
查看abs函数的帮助信息
定义一个函数
def my_abs(x):
... if x >= 0:
... return x
... else:
... return -x
注意:return None 等同于 return 等同于 无return语句
函数返回多值,比如坐标的x,y,z
数学函数:
abs(x) 绝对值函数
type(x) 类型函数
round(x) 四舍五入函数
内建函数
使用dir(builtins) 函数查看python中的内建函数
使用help(abs) 查看内建函数abs的信息(非内建函数无法使用此命令)
模块
类似于头文件
使用import math 导入math模块,使用math下的函数
一个完整的python文件就是一个模块,math模块的文件就是math.py
导入多个模块,模块间用逗号分开
导入指定的模块属性:from Module1 import ModuleElement
包package
一个层次文件的目录结构
比如:import AAA.CCC.c1导入AAA的子包BBB下的c1模块 或者 : from AAA.CCC.c1 import funct() 直接导入函数