目录
1. 语法基础
Python语言的风格
Python代码的注释
常用的两个标点符号
变量的创建、赋值、参数传递
库的引入
二元运算符和比较符
2. 数据结构基础
Python的标量
数值类型
Python的字符串
Python的布尔变量
Python的变量类型转换
3. 复数
复数的概念
4. 基础符号运算
新建符号
符号运算的基本操作
1. 语法基础
Python语言的风格
可读性强,简洁,清晰。常被称之为可运行的伪代码——看起来像代码但不能直接运行。
著名的特点:利用空格来组织代码。
Python使用空白字符(tab和空格/缩进)来组织代码,而不是像其它语言,如R、 C++、 JAVA 和Perl那样使用括号。Python的缩进是强制的。
冒号标志着缩进代码块的开始,冒号之后的所有代码的缩进量必须相同,直到代码块结束。不管是否喜欢这种形式,使用空白符是Python程序员开发的一部分,可以让python 的代码可读性大大优于其它语言。
在spyder里,使用table按键可以直接缩进4个空格。通常遇到需要缩进的地方,编辑器也会自动帮助缩进——如打冒号后会自动缩进。采用其它IDE的同学,也建议使用4个空格作为默认的缩进方法。
Python语言无需分号作为语句结束的标志。不过如果你想把几个语句写在同一行里,还是需要用分号分割一下。总的来说,不太建议把几个语句写在同一行里,会降低代码的可读性。除非语句真的非常简短,并且几个语句之间存在并列关系。
Python代码的注释
注释有助于他人和自己理解代码的具体意义,分为单行注释和多行注释。
单行注释用“#”符号开头,写在语句前面后面都可以。
多行注释用三个双引号"或者三个单引号'圈起来,一般用于注释过长的情况。
# 单行注释
"""
使用三个双引号
进行多行的注释
"""
'''
三个单引号也可以用来
进行多行的注释
'''
注意注释不是越多越好,对于一目了然的代码,不需要添加注释。对于复杂的操作,应该在操作开始前写上相应的注释。对于不是一目了然的代码,应该在代码之后添加注释。
• 绝对不要描述代码。一般阅读代码的人都了解Python的语法,只是不知道代码要干什么。
函数(FunctionType)
函数是封装了一些独立的功能,可以直接调用,能将一些数据(参数)传递进去进行处理,然后返回一些数据(返回值),也可以没有返回值。可以直接在模块中进行定义使用。 所有传递给函数的 数据都是显式传递的。
方法(MethodType)
方法和函数类似,同样封装了独立的功能,(方法不能独立调用)但是方法是只能依靠类或者对象来调用的,表示针对性的操作。
方法中的数据self和cls是隐式传递的,即方法的调用者; 方法可以操作类内部的数据。
简单的说,函数在python中独立存在,可直接使用的,而方法是必须被别人调用才能实现的。
• 与类和实例无绑定关系的function都属于函数(function)
• 与类和实例有绑定关系的function都属于方法(method)
常用的两个标点符号
点. 和圆括号()
用点. 引用对象里附加的方法(点符表示依附关系)
obj.some_method(x, y, z)
# 点符表示此函数并不是独立函数,依附于一个对象,对象为实例化的一个类
# obj:对象,somemethod:对象里的某一个方法,括号:传入参数
用圆括号() 调用函数,传递零个或几个参数,或者将返回值给一个变量
result=f(x, y, z) # f是函数名字,x, y, z是传入的参数
g() # 也可以没有参数
变量的创建、赋值、参数传递
变量,类似于xyz之类的名字,是代码编写过程中的基本元素。Python作为高级语言,变量无需申明即可直接调用,也无需强制手动规定变量类型。 赋值使用“=”符号实现,注意这里的=并不表示等于的意思,而是将右边的值传递给左边。
变量可以赋数值,也可以是布尔变量,字符串,字典等各种数据结构。如果是数值,可以是一个标量值,也可以是一个向量值,或者是矩阵,复数,实数等。
a=1 #将1赋值给a(赋数值)
x=[1,2,3] #列表
y="hello world" #字符串
z=True #布尔变量
库的引入
库的本质就是其它.py文件。如果在某个新的.py文件里使用其它.py文件,就需要提前引用。
利用.符号来使用已有文件里面的函数(方法)和变量。
使用as,可以给引入的文件起个新的名字。
二元运算符和比较符
2. 数据结构基础
数据结构:编程语言对待数的结构,计算机数据以二进制0,1,0,1的形式保存在内存里,不能直接操作,所以对它们进行分类,不同的编程语言有不同的分类方法,所以不同语言数据结构不同。
Python的标量
标量:单一的量。矢量:有方向的一组数、向量。
处理数值数据、字符串、布尔值,和日期时间。这些单位类型被称为标量类型。
【日期和时间处理会另外讨论,因为它们是标准库的datetime模块提供的。】
数值类型
主要数值类型是int和float。整型和浮点型。
① int可以存储任意大的整数,没有溢出问题。Python支持的整型变量是没有上限的。
import sys
MAX_INT=sys.maxsize
print(MAX_INT) # 看电脑中所能支持的最大整型是多少
result:
runfile('/Users/username/.spyder-py3/temp.py', wdir='/Users/username/.spyder-py3')
9223372036854775807
# 最大整数是2^64-1
生成一个远远大于9223372036854775807的数,仍可以算出来:
a=99999999999999999
b=6
x=a**b
print(x)
result:
runfile('/Users/username/.spyder-py3/temp.py', wdir='/Users/username/.spyder-py3')
9223372036854775807
999999999999999940000000000000001499999999999999980000000000000000149999999999999999400000000000000001
② float可以存储浮点数,全部是双精度(64位)存储。float就是带小数点的数,双精度有更多位数来存储小数点后面的数,小数点后面的位数更多了,精度提高。
a=0.0000000000001
b=1.23e-10
c=12.34
print(a,b,c)
# a,b,c这三个数值都是整型变量
result:
runfile('/Users/username/.spyder-py3/temp.py', wdir='/Users/username/.spyder-py3')
1e-13 1.23e-10 12.34
int型的除法如果除不尽,则自动产生float型结果: 如果想产生int型结果,可以用//:用双除取整
a=12
b=4
c=5
print(a/b)
print(a//c)
print(a/c)
result:
runfile('/Users/username/.spyder-py3/temp.py', wdir='/Users/username/.spyder-py3')
3.0 # 结果是实型变量,//b则结果为3——整型变量
2
2.4
Python的字符串
数值:12345678910 字符:abcdefg
可以用单引号或双引号来写字符串, 换行字符串用三个引号:
a='this is string'
b="also string"
c='''
this
is
string
too
'''
print(a)
print(b)
print(c)
result:
runfile('/Users/username/.spyder-py3/temp.py', wdir='/Users/username/.spyder-py3')
this is string
also string
this
is
string
too
字符串可以直接赋值获得,也可以用str函数获得。变成字符串之后的数值尽管看起来还是数字,但已经不能用于运算了。
a=38
b=str(a) #str将int型变量转换成str型(字符串)
print(a)
print(b)
print(a*a)
print(b*b) #不是整型变量,不能用于运算了
result:
runfile('/Users/username/.spyder-py3/temp.py', wdir='/Users/username/.spyder-py3')
38
38
1444
Traceback (most recent call last):
File "/Users/username/.spyder-py3/temp.py", line 7, in <module>
print(b*b) #不是整型变量,不能用于运算了
TypeError: can't multiply sequence by non-int of type 'str'
字符串里的反斜杠符号有特殊含义, \ 通常用于表示特殊字符,例如换行符 \n
如果字符串里确实含有反斜杠符,则需要两个反斜杠符才能正确显示。
a='this is \n'
b='this is \\n'
print(a)
print(b)
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
this is
this is \n
如果字符串里含有很多反斜杠符,但实际上都不是转义符。一个一个键入反斜杠符很麻烦,可以在字符串前面加r表示这里的反斜杠符是字符串本身。
a=r'this is \n , \it is \not \special\characters'
b='this is \n , \it is \not \special\characters'
print(a)
print('#\n#\n#')
print(b)
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
this is \n , \it is \not \special\characters
#
#
#
this is
, \it is
ot \special\characters
字符串可以相加(拼接):不是数值上的加减。
a='hello'
b='world'
print(a)
print('#\n#\n#')
print(b)
print('#\n#\n#')
print(a+b)
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
hello
#
#
#
world
#
#
#
helloworld
Python的布尔变量
布尔变量(Boolean Variable)就是逻辑变量, True和False,在程序里用1和0表示,要注意尽管是数字形式,但是它不是数值。
如同数值变量可以进行加减乘除运算一样,布尔变量可以进行逻辑运算。
a=True
b=False
x=bool(0)
y=bool(1)
print(a, b,x,y)
print(a or b)
print(x and y)
print(not a)
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
True False False True
True
False
False
尽管不用0或1,或者不用布尔变量也可以执行布尔运算,但是容易造成代码逻辑混乱,因此不推荐滥用数值变量进行布尔运算。
a=100
b=200
x=bool(10) #true,python程序中把所有非0数值通通看作true
y=bool(-20) #true
print (a,b,x,y)
print(a or b)
print(x and y)
print(not a)
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
100 200 True True
100 #可以得到运行结果,但是逻辑上没有道理
True
False
Python的变量类型转换
str,int,float,bool这些常用类型可以互相转换
a=3.1415926
b=str(a)
x=int(a)
y=float(a)
z=bool(a)
print (b,x,y,z)
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
3.1415926 3 3.1415926 True
另外有一个特殊的类型,None(表示一个空值,与0不同,0是一个数值/布尔变量)
a=None #表示空值
b=5
c=a is None
d=b is not None
print(c,d)
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
True True
Python的日期变量:内置了一个datatime的包,用来表示时间。
3. 复数
复数的概念
复数是由一个实数和一个虚数组合构成,表示为: x+y·j 一个复数时一对有序浮点数 (x,y),其中x 是实数部分,y是虚数部分。
Python 语言中有关复数的概念:
1、虚数不能单独存在,它们总是和一个值为0.0的实数部分一起构成一个复数
2、复数由实数部分和虚数部分构成
3、表示虚数的语法: real + imagej
4、实数部分和虚数部分都是浮点数 【3需要写成3.0】
5、虚数部分必须有后缀 j 或 J
注意用j而不是习惯的i表示复数的虚部,直接用数值加j表示虚部。
a=100.05+90j #一个复数
print(a)
print(a.real) #显示出实部
print(a.imag) #显示出虚部
'''
点符.意味着方法,方法意味着它依赖于实例化的对象,但a是一个变量?
怎么变成了对象?是因为虚数在python里面是被当成对象看待的。
虚数本身被视为一个类,而每创建一个虚数,实际上就是在对虚数这个类进行一次实例化,生成了一个对象。
正是因为每一个虚数的变量都是一个对象,因此可以调用对象里面的类里面自带的一些方法,
像此处的real方法和imag方法就是它自带的方法。
'''
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
(100.05+90j)
100.05
90.0
复数对象有三个内建功能(方法)。real实部,image虚部,conjugate共轭(共轭:虚数部分的正负号颠倒一下即可)。
a=100.05+90j #一个复数
print(a)
print(a.real) #显示出实部
print(a.imag) #显示出虚部
print(a.conjugate()) #共轭操作
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
(100.05+90j)
100.05
90.0
(100.05-90j)
另外可以用complex函数创建复数。
va=100.05+90j #一个复数
a=10.5 #一个实型变量
b=20 #一个整型变量
c=a-b*1j
print(c)
d=complex(a,b) #用complex函数扭转,将a和b转成复数
print(d)
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
(10.5-20j)
(10.5+20j)
对应math库,有处理复数的数学库,cmath。
导入math库,实现实数的计算。
import math
a=math.pi/6
print(math.sin(a))
from math import pi,sin
b=pi/2
print(sin(b))
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
0.49999999999999994
1.0
复变正弦函数与余弦函数定义是通过欧拉公式转换成的
对虚数进行三角函数的计算(涉及欧拉公式,为复数和三角函数搭建起桥梁,复数也可进行三角函数的计算了)
import cmath
a=cmath.pi/6*1j
print(cmath.sin(a)) # 对虚数进行三角函数的计算
from cmath import pi,sin
b=pi/2*1j
print(sin(b))
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
0.5478534738880397j
2.3012989023072947j
欧拉公式的验证:
from cmath import exp, sin, cos
a=5*1j
b=exp (5*1j)-cos(5)-1j*sin(5)
c=sin(5)
d=cos(5)
e=exp(5*1j)
print(b, '\n',c, '\n', d, '\n', e)
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
0j
(-0.9589242746631385+0j)
(0.2836621854632263+0j)
(0.2836621854632263-0.9589242746631385j)
4. 基础符号运算
符号运算与数值计算对应。通俗地说就是用计算机推导数学公式,如对表达式进行因式分解、化简、微分、积分、解代数方程、求解常微分方程等。通过符号运算算出来的公式叫做解析解。
python利用SymPy库实现这一功能。
数值解是带浮点数的近似值,而符号解(解析解)则是精确值。
解析解在一些问题中很难获得,所以要利用数值法通过迭代、逐步逼近真值的方法求解。
import math
math.pi #调用math库里面的pi
print(math.sin(math.pi))
# 符号解
from sympy import sin, pi
print(sin(pi))
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
1.2246467991473532e-16 #sin(pi)应该为0,但算出来不是0,因为计算机以浮点数形式存储pi,而pi本身是一个超越数,所以会存在误差(数值解永远是带浮点数的近似值)
0 #pi用符号解得到绝对的精确值
对竖直上抛物体的位移方程进行微分,然后再积分
from sympy import symbols,Rational,diff,integrate #导入符号库里面的函数
t,v0,g=symbols('t v0 g' ) #用symbol函数定义3个变量y,v0和g
y=v0*t-Rational(1,2)*g*t**2
#rational numbers有理数1/2,不用0.5,用了0.5得到的就不是解析解了。0.5表示实型变量,1/2表示有理数,0.5可能是带有截断的无理数。
dydt=diff(y,t) #对t做一次微分
print(dydt)
dydt2=diff(y,t,t) #对t做2次微分
print (dydt2)
y2=integrate(dydt,t) #对做了一次微分后的函数dydt对t做一次积分
print(y2)
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
-g*t + v0
-g
-g*t**2/2 + t*v0
新建符号
在使用符号之前,先要利用symbols函数定义符号
from sympy import symbols
#新建符号x,y
x,y=symbols('x y')
#利用SymPy的abc子模块新建符号x,y
from sympy.abc import x,y
#利用SymPy的abc子模块导入所有拉丁、希腊字母
from sympy import symbols
x=symbols('x',positive = True)# 新望符号变量时可以指定其定义域
#
vars= symbols('x_1:5')
print(vars)
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
(x_1, x_2, x_3, x_4)
例子:
【符号计算,计算机不擅长,数值计算较擅长。】
from sympy import *
x,y,z=symbols('x y z')
y=expand((x + 1)**2) #expand()是展开函数
print(y)
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
x**2 + 2*x + 1
符号运算的基本操作
①替换subs
from sympy import *
x=symbols('x')
expr= cos(x)+1 #表达式(是一个对象,调用里面的subs方法)
print(expr.subs(x,0)) #将表达式里的变量x替换成0(类似于赋值)
result:
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
2
②sympify字符串转换符号表达式
from sympy import *
str_expr= ' x**2 + 2*x + 1 '
expr=sympify(str_expr)
print(expr)
#将字符串转化为可以计算的表达式,这个表达式用subs进行替换是可以算出值来的
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
x**2 + 2*x + 1
③化简simplify
from sympy import *
from sympy.abc import x,y
print(simplify(sin(x)**2 + cos(x)**2)) #使用simplify函数进行化简
print(simplify(2*sin(y) *cos(y)))
runfile('/Users/un/.spyder-py3/temp.py', wdir='/Users/un/.spyder-py3')
1
sin(2*y)