Python常用于:
Python开发的框架:
Google开源机器学习框架:TensorFlow
开源社区主推学习框架:Scikit-learn
百度开源深度学习框架:Paddle
Python是一门解释型语言,因此使用python编程必须先安装python解释器
也因为python是解释型语言,是脚本语言,不是编译型语言,所以代码从上到下运行,是可以不需要主方法的
下面的语法讲解主要讲同java的区别以及python的一些特殊语法
没有分号结尾
以缩进表示代码块间关系
所以如果一个if里面或者方法/类里面没东西时一定要写pass,否则报错
同MATLAB一样,如果一行中仅输入变量名或常量,将打印在控制台
注释
单行注释用#
多行注释用’’'或者""",如下:
#单行注释
'''
多行注释
'''
"""
俺也是多行注释
"""
从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)
#
print(type(a))
下面是print函数调用参数表
print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout)
E = [1, 2, 3]
for i in E:
print(i, end=" ")
# 现在打印结果如下
# 1 2 3
print打印多个表达式时,用逗号分隔他们,结果是在参数中插入一个空格字符:
print('Age:' , 10)
# Age: 10
但也可以像java一样通过"+"拼接,此时需要前后都是字符串,不会插入空格:
print('Age:'+10)
# Age:10
占位符基本与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岁了
可以使用type()函数检测数据类型
变量就是⼀个存储数据的的时候当前数据所在的内存地址的名字⽽已, 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']
前面将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()函数较为常用:
在Python中evel()函数的语法格式为eval(expression, globals=None, locals=None)
,注意后面还有globals参数和locals参数。eval()函数用于执行一个字符串表达式,并且返回该表达式的值。与eval相近的有exec函数
示例:
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)'
# 输出
print(type(eval(str1)))
#
print(type(eval(str2)))
#
print(type(eval(str3)))
前面介绍了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参数
俩种模块导入:
import 模块名
只导入模块,不导入模块中具体对象,使用时要用模块名.对象名的方式进行访问
from 模块名 import 对象名1(函数名) 对象名2(函数名) …
只能导入模块中具体对象,使用时直接使用对象名不需要加上模块名(但是这种方法可能导致导入的对象或者函数与自己写的代码重名)
例如当导入了俩个具有相同名字函数的模块时, 执行的时候调⽤到的是后⾯导⼊的模块的功能
一次导入模块中所有对象:from 模块名 import *
相当于导入一个模块中的一个函数并为他创建一个对象, 是这个意思吗?
俩种都可以在后面加上: as 别名
和Java区别:
Java的import更多的是导入类或者静态变量
** : 幂运算
/ : 相除,结果为浮点数
// : 整除
% : 取余,当除数(后面那个)是负数时结果为负,其他为正
逻辑与: 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
is,is not对比的是俩个变量的内存地址,==,!=对比的是俩个变量的值.由此:
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是被重写过的)
语法:
条件成⽴执⾏的表达式 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
使用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
条件语句:if,elif,else.不需要括号,但需要在结尾加上冒号:
if 条件:
条件成⽴执⾏的代码1
条件成⽴执⾏的代码2
elif 条件2