吉吉:
python基础知识
python这么火爆,那么你知道它有哪些长处吗,扬长避短才是选择一门语言的首要依据。
##pyhto语言的主要特点
-
Python具有良好的跨平台特性。程序无需修改在Windows、Linux、Unix、Mac等操作系统上使用。
-
Python是一种解释性语言。开发工具首先把Python编写的源代码转换成称为字节码的中间形式。运行时,解释器再把字节码翻译成适合于特定环境的机器语言并运行。这使得Python程序更加易于移植。(脚本语言和编程语言的区别也可以看出来)
-
胶水语言:具有良好的可扩展性。可以把多种不同语言编写的程序融合到一起实现无缝拼接,更好地发挥不同语言和工具的优势,满足不同应用领域的需求。例如,Python可以调用使用C、C++等语言编写的程序,同样也可以将Python程序嵌入到其他程序设计语言中,或者作为一些软件的二次开发脚本语言。
-
Python支持面向过程的编程,程序可以是由过程或仅仅是由可重用代码的函数构建起来。同时,Python从设计之初就是一门面向对象的语言,因此也支持面向对象的编程。
比如以公共汽车而言。
“面向过程”就是汽车启动是一个事件,汽车到站是另一个事件。在编程序的时候我们关心的是某一个事件。而不是汽车本身。我们分别对启动和到站编写程序。类似的还有修理等等。与面向对象明显的不同就是封装、继承、类。
个人觉得了解那些使用python的企业是十分重要的,会给了我们pythoner带来对未来的一些方向感。
##目前使用Python的企业
- Google 在其网络搜索系统中广泛应用了Python ,并且聘用了Python 的创作者。
- YouTube 视频分享服务大部分是由Python 编写的。
- 流行的P2P 文件分享系统Bittorrent 是一个Python 程序。
- Intel 、Cisco 、Hewlett-Packard 、Seagate 、Qualcomm 和IBM 使用Python 进行硬件测试。
- Industrial Light & Magic 、Pixar 等公司使用Python 制作动画电影。
- NASA 、Los Alamos 、Fermilab 、JPL 等使用Python 实现科学计算任务。
- IRobot 使用Python 开发了商业机器人真空吸尘器。
- ESRI 在其流行的GIS 地图产品中使用Python 作为终端用户的定制工具。
- NSA 在加密和智能分析中使用Python 。
##Python缺点
任何编程语言都有缺点,Python缺点主要有: - 运行速度慢。(但是可以嵌入c改善)
- 用缩进来区分语句关系的方式还是给很多初学者带来了困惑。即便是很有经验的Python程序员也可能陷入陷阱当中。最常见的情况是tab和空格的混用会导致错误。
个人觉得第一点才是python的硬伤,哈哈。
##Python文件名
大家可能最熟悉的是py格式的文件,其实不仅仅只用这一种python格式的文件
- .py:Python源文件,由Python解释器负责解释执行。
- .pyw:Python源文件,常用于图形界面程序文件。
- .pyc:Python字节码文件,无法使用文本编辑器直接查看该类型文件内容,可用于隐藏Python源代码和提高运行速度。对于Python模块,第一次被导入时将被编译成字节码的形式,并在以后再次导入时优先使用“.pyc”文件,以提高模块的加载和运行速度。对于非模块文件,直接执行时并不生成“.pyc”文件,但可以使用py_compile模块的compile()函数进行编译以提高加载和运行速度。
- .pyd:一般是由其他语言编写并编译的二进制文件,常用于实现某些软件工具的Python编程接口插件或Python动态链接库。
上面是对python这门语言的简单叙述,接下来进入正式的学习
首先从python对象开始简单叙述一下
- Python 3中,一切皆为对象,包括如数字、字符串、列表、del命令、函数等。
- 对象本质上是一个内存块,拥有特定的值,支持特定类型的运算操作。(注意要理解对象的本质)
- 每个对象由地址(identity)、类型(type)和值(value)标识。
##Python的对象模型 - 通过内置的id()函数,可以获取一个对象唯一的id标识(CPython的实现为内存存放位置)
- 通过内置的type()函数,可以判断一个对象的类型
- 使用内置函数print(obj1)可返回对象obj1的值
- 使用内置函数type()、id()和print()查看对象
123#输出:123
id(123)#输出:505912816
type(123)#输出:<class 'int'>
print(123)#输出:123
字面常量
- 按接近人的习惯设计并加以不同数据类型的区别,是数据的“书写形式”,也称为字面量。如整数389,浮点数23.56,字符串‘hello‘。
- 字面量可以直接创建对象实例,即在内存中生成一个对象
- 打印hello字符串变量
#使用”hello world”字符串字面常量创建字符串对象,并打印出来。
>>>print("hello world!")
hello world!
>>>id("hello world!")
2160946345968
变量
- 对象存储在内存中,如果用一个名称来引用内存空间,这个名称就称为变量。
- 为了引用对象,必须通过赋值语句,把对象赋值给变量(也称之为把对象绑定到变量)
- 打印hello字符串变量
#使用变量打印”hello world”字符串。
>>>message="hello world!"
>>>print(message)
hello world!
- 在Python中,不需要事先声明变量名及其类型,直接赋值即可创建各种类型的对象变量。变量的值是可以变化的。例如语句
>>>x=3
#创建了整型变量x,并赋值为3,再例如语句
>>>x='Hello world.'
#创建了字符串变量x,并赋值为'Hello world.'。
- 赋值语句的执行过程是:首先把等号右侧表达式的值计算出来,然后在内存中寻找一个位置把值存放进去,最后创建变量来指向这个内存地址,实现对这个值的引用(重点)
- Python中的变量并不存储值,而是存储了值的内存地址或者引用,这也是变量类型随时可以改变的原因。(重点)
- 如果变量出现在赋值运算符或复合赋值运算符(例如+=、*=等等)的左边则表示创建变量或修改变量的值,否则表示引用该变量的值。
>>> x = 3 #创建整型变量
>>> print(x**2)
9
>>> x =x+ 6 #修改变量值
>>> print(x)#读取变量值并输出显示9
在python中变量总是一个指向对象的指针,给一个变量赋新的值,并不是改变对象的值,只是改变对对象的引用。
- Python采用的是基于值的内存管理方式,如果为不同变量赋值为相同值(仅适用于-5至256的整数和短字符串),这个值在内存中只有一份,多个变量指向同一块内存地址。
>>> x = 3
>>> id(x)
10417624
>>> y = 3
>>> id(y)
10417624
>>> x = [1, 1, 1, 1]
>>> id(x[0]) == id(x[1])
True
- Python是一种动态类型语言,变量的类型也是可以随时变化的。
>>> x = 3
>>> print(type(x))
<class 'int'>
>>> x = 'Hello world.'
>>> print(type(x)) #查看变量类型
<class 'str'>
>>> x = [1,2,3]
>>> print(type(x))
<class 'list'>
>>> isinstance(3, int) #测试对象是否是某个类型的实例
True
>>> isinstance('Hello world', str)
True
- Python属于强类型编程语言,Python解释器会根据赋值或运算来自动推断变量类型。
- Python具有自动内存管理功能,对于没有任何变量指向的值,Python自动将其删除。Python会跟踪所有的值,并自动删除不再有变量指向的值。因此,Python程序员一般情况下不需要太多考虑内存管理的问题。
- 尽管如此,显式使用del命令删除不需要的值或显式关闭不再需要访问的资源,仍是一个好的习惯,同时也是一个优秀程序员的基本素养之一。
>>>x=1#变量x指向对象1
>>>del x#删除变量x
>>>x#变量x没有声明和定义(NameError)
赋值语句
赋值是创建变量的一种方法。赋值的目的是将值与对应的名字进行关联或改变变量的值。
- 简单赋值语句的格式 :变量 = 表达式
其中等号表示赋值,等号左边是一个变量,右边是一个表达式(由常量、变量和运算符构成)。
>>>myVar = "Hello World!"
>>> myVar = 3.1416
>>>myVar=3+3*5
>>> print (myVar)
18
>>>myVar=myVar+1
>>> print (myVar)
19
>>>myFloat #未定义
- 链式赋值语句(链式赋值用于为多个变量赋值同一个值
)
变量1=变量2=表达式
等价于:
变量2=表达式
变量1=变量2
- 链式赋值语句示例
>>>x=y=123 #变量x和y均指向对象123
>>>x #输出123
>>>y #输出123
- 复合赋值语句
复合赋值运算符:+=、-=、*=、/=、//=、**=等。
例如:
x += 3
x = x + 3
#在语法上等价
- 序列解包赋值
将序列数据类型解包为对应相同个数的变量,可实现对多个变量赋值。
使用序列解包赋值语句交换变量示例
>>> x,y = 1,2
>>> x
1
>>> y
2
>>>x,y=y,x #使用序列解包赋值实现变量交换
>>>x
2
>>>y
1
数据类型
在内存中存储和处理数据与现实世界不同,是区分数据类型的,不同的数据类型占用不同的字节数,并有着不同的编码和运算机制。
###整型数据int
- 整数就是没有小数部分的数值,包括整数、0和负整数。默认情况下采用十进制,但也可采用八进制、十六进制和二进制数。
- 十进制整数示例:100、0、 -100
- python的整数的大小只受机器的内存大小限制
- int数据示例(其它进制数)
>>> 0o137#八进制
95
>>> 0b111#二进制
7
>>> 0xff #十六进制
255
>>> type(28346283742874)
<class 'int'>
>>> a=99999999999999999999
>>> a*a
9999999999999999999800000000000000000001
>>> a**3
999999999999999999970000000000000000000299999999999999999999
浮点型数据float
- 小数形式
47.584 - 指数形式
8.9e-4表示8.9×10-4 即0.00089
- float数据示例
>>> type(12)
<class 'int'>
>>> type(12.0)
<class 'float'>
>>> 8.9e-4
0.00089
>>> type(1.2e1)
<class 'float'>
>>> print(23/1.05)
21.904761904761905
布尔类型数据bool
- Python的布尔类型数据只有两个:True和False,表示真和假。
- 以真和假为值的表达式称为布尔表达式,用于表示某种条件是否成立,以支持选择控制和循环控制中必不可少的条件判断。
- 布尔数据示例
>>> type(True)
<class 'bool'>
>>> x,y=10,20
>>> x>y
False
>>> x+10<=y
True
复数类型数complex
- 表示为
real + imag(J/j后缀) - 4.23+8.5j
- 复数示例
>>> aComplex=4.23+8.5j
>>> aComplex
(4.2300000000000004+8.5j)
>>> aComplex.real 4.2300000000000004
>>> aComplex.imag
8.5
>>> aComplex.conjugate()
#返回复数的共轭复数
(4.2300000000000004-8.5j)
数值数据的计算
数值数据可参与的运算包括算术运算、关系运算、逻辑运算、位运算。
###算术运算
- Python提供的算术运算包括加、减、乘、除和求余运算,与数学中的算术运算的定义基本相同。
- 不同的地方有Python支持的除法区分为普通的除法和整除。
- 整数的除法和整除示例
>>> x=8
>>> y=3
>>> x/y
2.6666666666666665
>>> x//y
2
浮点数的除法和整除示例如下
>>> x=3.8
>>> y=0.7
>>> x/y
5.428571428571429
>>> x//y
5.0
- 判断一个数是否是偶数
%为求余数的运算,可以通过求余运算来判断一个数是否能被另一个数整除。
>>> x=834
>>> x%2==0
True
还可以对浮点数计算余数。由于浮点数的精确度影响,计算结果可能略有误差。
>>> 3.1%2
1.1
>>> 6.3%2.1
2.0999999999999996
>>> 6%2
0
>>> 6.0%2
0.0
- 幂运算
**运算符表示幂乘
>>> 3 ** 2#3的2次方,等价于pow(3, 2)
9
>>> 9 ** 0.5 #9的0.5次方,平方根
3.0
关系运算
- 数值运算的关系表达式由数值数据和关系运算构成,得到的结果为布尔类型数据:True或False。
- 一般形式为:
<数值1><关系运算符><数值2>
- 区别运算赋值=与相等==。
>>> 20==20
True
>>> 20=20
SyntaxError: can't assign to literal
>>> x,y=10,20
>>> x==y
False
>>> x=y
>>> x
20
- 级联比较形式示例
>>> a,b,c=10,20,30
>>> a<=b<=c
True
- 浮点数的误差示例(重点)
>>> x=3.141592627
>>> x-3.14
0.0015926269999999576
>>> 2.1-2.0
0.10000000000000009
从这个例子可以得到一条经验:不能用==来判断是否相等,而是要检查两个浮点数的差值是否足够小,是则认为是相等的。
>>> 2.1-2.0==0.1
False
>>> esp=0.000000001
>>> abs((2.1-2.0)-0.1)<esp
True
逻辑运算
- 逻辑与and、逻辑或or、逻辑非not
- 判断某一年是否是闰年
判断闰年的依据满足下面两个条件之一:
该年能被4整除但不能被100整数
该年能被400整除
>>> y=2010
>>> (y%4==0 and y%100!=0) or(y%400==0)
False
>>> y=2012
>>> (y%4==0 and y%100!=0) or(y%400==0)
True
>>> y=2000
>>> (y%4==0 and y%100!=0) or(y%400==0)
True
- 逻辑运算符and和or具有惰性求值特点。
函数式编程语言还提供惰性求值(Lazy evaluation,也称作call-by-need),是在将表达式赋值给变量(或称作绑定)时并不计算表达式的值,而在变量第一次被使用时才进行计算。(重点)
位运算(了解)
- 位运算符只能用于整数,其内部执行过程为:首先将整数转换为二进制数(补码),然后右对齐,必要的时候左侧补0,按位进行运算,最后再把计算结果转换为十进制数字返回。
>>> 3 << 2 #把3左移2位 即011变为01100
12
>>> 3 & 7#位与运算
3
>>> 3 | 8 #位或运算
11
>>> 3 ^ 5#位异或运算
6
表达式的计算顺序
表达式可以很简单,也可能很复杂,其中包含了多个不同类型的运算符,那不同类型的运算符按照什么顺序运算呢?
- 优先级
算术运算符的优先级设定与数学中基本相符 - 结合方式
结合方式或称结合律会规定具有相同优先级的运算符相邻出现时,运算符是从左向右结合,还是从右向左结合。Python 的结合方式是由左到右。 - 括号
括号可以突破计算的优先级,强制地规定计算顺序,括号括起部分的表达式会先行计算。
####数值数据常用运算符的优先级(重点)
混合运算的类型转换
计算机表达式中的数据区分不同的类型,同类型数据运算得到同类型的数据,那不同类型的数据出现在同一表达式中,如何运算?
- 程序中一般同类型数据运算得到同类型的数据,但也有例外。
- 不同类型的数据运算时首先要转化为同一数据类型。
- 思考:
>>> 6/4*4 #6/4得到1.5
6.0
>>> 6//4*4 #6//4得到1
4
两种类型转换方式:
自动转换
强制转换
- 自动转换
系统自动完成的,不需要在程序中写出。
自动转换的基本原则:
将表示数值范围小的数据类型的值转换到表示数值范围大的数据类型的值,这样能避免由于类型转换造成的误差损失。
- 自动转换示例
>>> 3.0+2
5.0
>>> type(3.0+2)
<class 'float'>
- 强制转换机制或显式转换
在程序语句中明确类型转换的描述,要求执行类型转换。
python语言提供各种类型的转换函数
- 显式转换示例
>>> x,y=23,12
>>> y=float(y)+0.5
>>> y
12.5
>>> complex(x,y)
(23+12.5j)
>>> hex(x)#将一个整数转换为一个十六进制字符串
'0x17'
>>> oct(x)#将一个整数转换为一个八进制字符串
'0o27'
>>> repr(x) #将对象 x 转换为字符串(以解释器的方式)
‘23'
>>> chr(13)#返回Unicode编码为x的字符
'\r'
>>> ord('\n')#将一个字符转换为它的整数值(Unicode码)
10
>>> str(x)#将对象 x 转换为字符串(以人类理解的方式)
'23'
>>> eval('23-12')#将字符串str当成有效表达式来求值,并返回计算结果
11
>>> eval('x-y')
11
- ord()和chr()是一对功能相反的函数,ord()用来返回单个字符的序数或Unicode码,而chr()则用来返回某序数对应的字符,str()则直接将其任意类型参数转换为字符串。
内置函数
- 内置函数不需要导入任何模块即可使用
- 执行下面的命令可以列出所有内置函数
>>> dir(__builtins__)
- 调用格式:[函数名](参数序列)
函数的调用方式与数学函数类似,函数名,加上相应的参数值,多个参数值以逗号分隔
常用的数学内置函数
pow(x, y,[, z])
返回x的y次方,等价于x ** y或(x ** y) % z,其中z是可选参数。
>>>Power(2,4)
16
>>>power(2,4,3)
1
round(x,n)
按“四舍五入”法对x保留n位小数
>>> round(78.3456,2)
78.35
divmod(x, y)
返回包含整商和余数的元组:((x-x%y)/y, x%y)
>>> divmod(10,3)
(3, 1)
参考:
- 百度百科https://baike.baidu.com/item/%E9%9D%A2%E5%90%91%E8%BF%87%E7%A8%8B/9957246?fr=aladdin
- 以董富国编著的《python程序设计》为主要参考