文章目录
- 1. Python
- 2 基础语法
- 3. 常用模块与函数
- 4. 自带数据结构(序列)
- 5. 基础++语法
- 6. 面向对象编程
1. Python
1.1 概述
Python常用于:
- 人工智能
- 数据分析
- 机器学习
- 爬虫
- 自动化测试
- 自动化运维
- web开发
- …
Python开发的框架:
Google开源机器学习框架:TensorFlow
开源社区主推学习框架:Scikit-learn
百度开源深度学习框架:Paddle
Python是一门解释型语言,因此使用python编程必须先安装python解释器
也因为python是解释型语言,是脚本语言,不是编译型语言,所以代码从上到下运行,是可以不需要主方法的
下面的语法讲解主要讲同java的区别以及python的一些特殊语法
2 基础语法
2.1 语法习惯
-
没有分号结尾
-
以缩进表示代码块间关系
所以如果一个if里面或者方法/类里面没东西时一定要写pass,否则报错
-
同MATLAB一样,如果一行中仅输入变量名或常量,将打印在控制台
-
注释
单行注释用#
多行注释用’’'或者""",如下:
#单行注释
'''
多行注释
'''
"""
俺也是多行注释
"""
- 使用pycharm进行编程时自带一个控制台终端, 相当于在命令行敲代码
2.2 输入输出函数
2.2.1 输入函数:input()
从python3开始input返回值类型一律为字符串 , 所以在输入数字时要使用int()函数(实际上是类,数据类型)进行转型 , 而java不同, Java转型没有int()函数, int是关键字, python的int是函数而不是关键字
Java转型:
String a = "3";
int b = Integer.parseInt(a);
double c = 3;
int d = (int) c;
python转型:
a = '3'
b = int(a)
在input括号里放的东西会被打印出来, 即input(“提示信息”), 可以将input输入的东西存储为变量:
a = input("请输入你的年龄:")
print(a)
# <class 'str'>
print(type(a))
2.2.2 输出函数:print()
2.2.2.1 参数表
下面是print函数调用参数表
print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout)
- objects – 复数,表示可以一次输出多个对象。输出多个对象时,需要用 , 分隔
- sep – 用来间隔多个对象,默认值是一个空格。
- end – 用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符串。
- file – 要写入的文件对象。
- print()函数会自动换行
因为end默认为’\n’,想实现不换行,可以换成其他字符串""(如空)
示例:
E = [1, 2, 3]
for i in E:
print(i, end=" ")
# 现在打印结果如下
# 1 2 3
2.2.2.2 分隔符
print打印多个表达式时,用逗号分隔他们,结果是在参数中插入一个空格字符:
print('Age:' , 10)
# Age: 10
但也可以像java一样通过"+"拼接,此时需要前后都是字符串,不会插入空格:
print('Age:'+10)
# Age:10
2.2.2.3 格式化输出:
占位符基本与java一致, 常用占位符:
占位符 | 对象 |
---|---|
%s | 字符串 |
%d | 整数 |
%f | 浮点数 |
和Java类似的占位符输出格式:
%06d,表示输出的整数显示位数,不⾜以0补全,超出当前位数则原样输出
%.2f,表示⼩数点后显示的⼩数位数
注意:
由于python的格式化输出都是将值转化为字符串输出, 因此不管输出什么都可以只有%s占位符
和Java有区别的地方:
Java格式化输出通过逗号:
int a = 1;
System.out.printf("a=%d", a);
python(不使用%分隔会失去格式化作用):
name = 'zhangsan'
age = 3
print('name=%s' % name) # name=zhangsan
print("abc%s" % "d") # 打印abcd
# 多个变量:
print('name=%s age=%d' % (name,age))
格式化字符串除了%s,还可以写为 f'{表达式}'
(从python3.6开始增加的格式化语法,这种语法更加简单易读):
name = 'zhangsan'
age = 3
print(f'我的名字是{name}, 明年{age + 1}岁了')
# 我的名字是zhangsan, 明年4岁了
2.3 变量和数据类型
2.3.1 标识符
- 由字母,数字,下划线组成
- 不能以数字开头
- 区分大小写
- 以下划线开头的标识符是特殊意义的
- 单下划线开头代表不能直接访问的类属性,需要通过类提供的接口访问,不能用from xxx import *导入
- 双下划线开头表示类的私有成员
- 双下划线开头和结尾表示python特殊方法专用的标识,如:__xx__表示Python内置标识,__xx__()标识构造方法
2.3.2 数据类型
- int : 整数, 包括任意大小
- 前缀OB或者Ob,表示二进制
- 前缀OO或者Oo,表示八进制
- 前缀OX或者Ox,表示十六进制
- 关于复数,虚部只能用j表示
- float: 浮点数, 小数
- str : 字符串, 可以单引号’双引号"三引号’’'或者"""括起来的文字,几种表示无区别
- bool : 布尔, 只有True,False俩种值
- 空值: 用None表示
- list : 列表
- tuple : 元组
- set : 集合
- dict : 字典
可以使用type()函数检测数据类型
2.3.3 变量
变量就是⼀个存储数据的的时候当前数据所在的内存地址的名字⽽已, python是弱类型语言, 定义变量不需要指定数据类型:
a = 3
b = 'b'
同时可以使用变量来引用函数
例如: foo = math.sqrt,可以使用foo来计算平方根,如foo(4)
同时python支持链式赋值
可以将多个变量同时关联到同一个值
示例:
x = y = somefunction()
# 上述代码与下面等价
x = somefunction()
y = x
# 但下面代码可能与上面不等价(x和y相等但不相同,指向地址不一样)
x = somefunction()
y = somefunction()
也支持同时给多个变量赋值:
x,y,z = 1,2,3
x,y = y,x
# 还可以用*收集多余的值(带星号的变量最终返回的是一个列表):
a,b,*c = [1,2,3,4] # c = [3,4]
# 还可以将带星号变量放在其他位置:
a = "w s n b"
first,*mid,last = a.split() # mid = ['s','n']
2.4 转换数据类型的函数
前面将input函数时已经说过使用int()函数可以将数据类型转换为整型了, 类似的, python还有其他可以进行数据类型转换的函数:
函数 | 说明 |
---|---|
int(x [,base ]) | 将x转换为⼀个整数 |
float(x ) | 将x转换为⼀个浮点数 |
complex(real [,imag ]) | 创建⼀个复数,real为实部,imag为虚部 |
str(x ) | 将对象 x 转换为字符串 |
repr(x ) | 将对象 x 转换为表达式字符串 |
eval(str) | ⽤来计算在字符串中的有效Python表达式,并返回⼀个对象 还可以将字符串中的数据转换成Python表达式原本类型 |
tuple(s) | 将序列 s 转换为⼀个元组 |
list(s ) | 将序列 s 转换为⼀个列表 |
chr(x ) | 将⼀个整数转换为⼀个Unicode字符 |
ord(x ) | 将⼀个字符转换为它的ASCII整数值 |
hex(x ) | 将⼀个整数转换为⼀个⼗六进制字符串 |
oct(x ) | 将⼀个整数转换为⼀个⼋进制字符串 |
bin(x ) | 将⼀个整数转换为⼀个⼆进制字符串 |
其中eval()函数较为常用:
2.4.1 eval()
在Python中evel()函数的语法格式为eval(expression, globals=None, locals=None)
,注意后面还有globals参数和locals参数。eval()函数用于执行一个字符串表达式,并且返回该表达式的值。与eval相近的有exec函数
- expression:表达式,上面提到evel函数用于执行一个字符串表达式,表达式的内容就放在此处
- globals:该部分必须是字典!必须是字典!必须是字典!否则程序会出错。当定义了globals 参数之后eval函数的作用域会被限定在globals中, 表示全局命名空间(存放全局变量)
- locals:该参数掌控局部的命名空间,功能和globals类型,不过当参数冲突时,会执行locals处的参数, 表示当前局部命名空间(存放局部变量), 最优先拿数据的作用域
示例:
a=10;
print(eval("a+1"))
# 11
因为此处没有指定globals和locals,所以直接执行expression部分的内容。该程序的效果等价于a=10 print(a+1)
带globals:
a=10;
g={
'a':4}
print(eval("a+1",g))
# 5
由于globals限制了作用域, 因此这里的a就只能是globals中的作用域, 因此打印5
而local是限制最大的作用域, 优先从local中拿数据, 再从globals中拿数据, 最后都没有才会去字典外作用域拿数据, 示例:
a=10
b=20
c=30
g={
'a':6,'b':8}
t={
'b':100,'c':10}
print(eval('a+b+c',g,t))
# 116
注意:
eval函数非常的方便,我们可以使用一行代码就实现计算器的功能:
print(eval(input('请输入')))
# 此时我们输入2+3,会直接输出5
但是因为它具有可以将字符串转成表达式执行的特性,所以它也就可以去执行系统命令。这样很容易被别有用心的人用来执行系统命令,删除关键系统文件, 因此eval函数必须慎用
除此之外eval函数还可以将字符串中的数据转换成Python表达式原本类型:
str1 = '10'
str2 = '[1, 2, 3]'
str3 = '(1000, 2000, 3000)'
# 输出<class 'int'>
print(type(eval(str1)))
# <class 'list'>
print(type(eval(str2)))
# <class 'tuple'>
print(type(eval(str3)))
2.4.2 exec函数
前面介绍了eval函数可以实现自动运行字符串中的计算表达式, exec函数类似, 但是exec函数能够动态地执行复杂的Python代码, 也就是说exec函数除了执行计算表达式字符串之外, Python代码字符串也是可以直接通过exec函数执行的
看下区别:
# 报错, 无法执行a=3这种Python代码
eval('a=3 ; print(a)')
# 输出3
exec('a=3 ; print(a)')
因此我们可以读取 Python代码的txt文件, 再通过exec函数运行
类似于eval函数, 同样有globals和locals参数
2.5 import语法
俩种模块导入:
-
import 模块名
只导入模块,不导入模块中具体对象,使用时要用模块名.对象名的方式进行访问
-
from 模块名 import 对象名1(函数名) 对象名2(函数名) …
只能导入模块中具体对象,使用时直接使用对象名不需要加上模块名(但是这种方法可能导致导入的对象或者函数与自己写的代码重名)
例如当导入了俩个具有相同名字函数的模块时, 执行的时候调⽤到的是后⾯导⼊的模块的功能
一次导入模块中所有对象:from 模块名 import *
相当于导入一个模块中的一个函数并为他创建一个对象, 是这个意思吗?
-
俩种都可以在后面加上: as 别名
和Java区别:
Java的import更多的是导入类或者静态变量
2.6 运算符
-
** : 幂运算
-
/ : 相除,结果为浮点数
-
// : 整除
-
% : 取余,当除数(后面那个)是负数时结果为负,其他为正
-
逻辑与: and
逻辑或: or
逻辑非: not小知识:python中的布尔运算符在判断时只做必要的计算
如:x and y中,如果x为假直接返回x,x为真则返回y,而不关心y的具体(在python中除了少数值外其他几乎所有值都为真)
而在x or y中同样如此,x为真直接返回x,为假则返回y
以下代码就利用了这种行为:name = input('Please enter your name:') or 'unknown' ''' 如果没有输入名字,则可以直接将name设置为'unknown' 但在大多数情况下,你宁愿使用条件表达式,而不耍这样的短路花样 '''
-
按位与: &,如5&6,转换为二进制101 & 110 = 100 = 4,所以5&6=4
按位或: 5 | 6 = 101 | 110 = 111 = 7,所以5|6 = 7
按位异或: 5 ^ 6 = 101 ^ 110 = 011 = 3,所以5 ^ 6 = 3
tips:异或是当符号前后俩者分别为T和F时才为T(所以运算针对二进制),俩个数字做异或时,先转换成二进制数,再把每一位的数字俩俩对比
-
>> << : 右移,左移
-
== != : 是否等于,是否不等
-
is,is not : 身份运算符
in,not in : 成员运算符 -
运算符优先级:
运算符 | 描述(由上至下由高到低) |
---|---|
** | 幂 |
~ + - | 取反,正号,负号 |
与Java主要区别:
-
**:幂, /相除, //整除
-
没有+±-, 但是有+=和-=等
-
Java 判断变量age是不是大于18小于20:
age > 18 && age < 20
python:
age > 18 and age < 20
或者:和链式赋值一样,python也支持链式比较(java不支持)
18 < age < 20
2.6.1 is,is not与==,!=
is,is not对比的是俩个变量的内存地址,==,!=对比的是俩个变量的值.由此:
- 对于地址不可变的类型(str等),is,==是完全等价的(==时代表俩者相等,is需要俩者相同,即地址一致)
- 对于地址可变的类型(list(列表),dict(字典),tuple(元组),set(集合)等),俩者有区别,但python对字符串可以直接使用==,因为str是不可变的类型,这是与java不同的
a = "Hello"
b = "Hello"
print(a is b,a == b)#输出为True True
a = ["Hello"]#可变的列表类型
b = ["Hello"]
print(a is b,a == b)#输出为False True
和Java区别:
Java是对于基本数据类型, ==判断值是否相等, 对于引用数据类型, ==判断地址, equals判断值(因为一般引用数据类型的equals是被重写过的)
2.6.2 三目运算符
语法:
条件成⽴执⾏的表达式 if 条件 else 条件不成⽴执⾏的表达式
示例:
a = 1
b = 2
c = a if a > b else b
print(c)
# 2
Java语法:
int c = 2>1 ? 2:1;
// c = 2
2.6.3 交换变量值
使用Java或者C的写法交换:
# 1. 定义中间变量
c = 0
# 2. 将a的数据存储到c
c = a
# 3. 将b的数据20赋值到a,此时a = 20
a = b
# 4. 将之前c的数据10赋值到b,此时b = 10
b = c
print(a) # 20
print(b) # 10
用python自带的特点交换:
a, b = 1, 2
a, b = b, a
print(a) # 2
print(b) # 1
2.7 流程控制基本语句
2.7.1 if-elif-else
条件语句:if,elif,else.不需要括号,但需要在结尾加上冒号:
if 条件:
条件成⽴执⾏的代码1
条件成⽴执⾏的代码2
elif 条件2:
条件2成⽴执⾏的代码1
条件2成⽴执⾏的代码2
else:
都不成⽴执⾏的代码1
都不成⽴执⾏的代码2
示例:
if True:
print('条件成⽴执⾏的代码1')
print('条件成⽴执⾏的代码2')
# 下⽅的代码没有缩进到if语句块,所以和if条件⽆关
print('我是⽆论条件是否成⽴都要执⾏的代码')
和Java区别:
else if变成了elif, 多了个:少了个()
注意:
- 布尔表达式(如用作if语句中的条件)时,以下值都将被解释为假:
False None 0 “” () [] {}
- in可以用于条件表达式中
- 使用两个字符串中的字符执行Python字符串比较
两个字符串中的字符被一一比较
当找到不同的字符时,将比较它们的Unicode值。Unicode值较低的字符被认为较小
可以使用ord()函数来获取Unicode码
比较序列时同样将元素一一比较
2.7.2 while
while循环: 无括号,加冒号 :
while 条件:
条件成⽴重复执⾏的代码1
条件成⽴重复执⾏的代码2
......
示例:
i = 1
result = 0
while i <= 100:
result += i
i += 1
# 输出5050
print(result)
python的循环也支持break,continue ,不管是for循环还是while循环, 效果都和Java一致
while-else:
可以在循环中加入else子句, 此时的else子句仅在break没有执行时执行 (即循环正常结束时)
示例:
i = 1
result = 0
while i <= 100:
result += i
i += 1
else:
result += 1
# 输出5051
print(result)
i = 1
result = 0
while i <= 100:
result += i
i += 1
if i == 3:
break
else:
result += 1
# 0+1+2,接着被break, 没有经过else,直接输出3
print(result)
2.7.3 for循环
for…in循环:遍历任何序列(或任何可迭代对象) , 序列下面会讲:
常用到的可迭代的对象包括:string, list, dict, tuple, generator, range函数
for 临时变量 in 序列:
重复执⾏的代码1
重复执⾏的代码2
.....
示例:
str = "Python"
for s in str:
print(s) # 打印Python,每一个字母换一行
for i in range(0,5):
print(i) # 打印0到4
# 遍历字典
d = {
'x':1,'y':2}
for key in d: