python的来源
python是著名的“Guido van Rossum”在1989年圣诞节期间开发的编程语言
现在,全世界差不多有600多种编程语言,但流行的编程语言也就那么20来种。如果你听说过TIOBE排行榜,你就能知道编程语言的大致流行程度。tiobe的官方数据链接如下:
https://www.tiobe.com/tiobe-index/
总的来说,这几种编程语言各有千秋。C语言是可以用来编写操作系统的贴近硬件的语言,所以,C语言适合开发那些追求运行速度、充分发挥硬件性能的程序。而Python是用来编写应用程序的高级编程语言。
当你用一种语言开始作真正的软件开发时,你除了编写代码外,还需要很多基本的已经写好的现成的东西,来帮助你加快开发进度。比如说,要编写一个电子邮件客户端,如果先从最底层开始编写网络协议相关的代码,那估计一年半载也开发不出来。高级编程语言通常都会提供一个比较完善的基础代码库,让你能直接调用,比如,针对电子邮件协议的SMTP库,针对桌面环境的GUI库,在这些已有的代码库的基础上开发,一个电子邮件客户端几天就能开发出来。
Python就为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作“内置电池(batteries included)”。用Python开发,许多功能不必从零编写,直接使用现成的即可。
除了内置的库外,Python还有大量的第三方库,也就是别人开发的,供你直接使用的东西。当然,如果你开发的代码通过很好的封装,也可以作为第三方库给别人使用。
许多大型网站就是用Python开发的,例如YouTube、Instagram,还有国内的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美国航空航天局)都大量地使用Python。
python 的优点
life is short,you need Python –Bruce Eckel
龟叔给Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。
总的来说,Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写少的代码。如果一个资深程序员向你炫耀他写的晦涩难懂、动不动就几万行的代码,你可以尽情地嘲笑他。
那Python适合开发哪些类型的应用呢?
首选是网络应用,包括网站、后台服务等等;
其次是许多日常需要的小工具,包括系统管理员需要的脚本任务等等;
另外就是把其他语言开发的程序再包装起来,方便使用。
Python的缺点
任何编程语言都有缺点,Python也不例外。优点说过了,那Python有哪些缺点呢?
第一个缺点就是运行速度慢,和C程序相比非常慢,因为Python是解释型语言,你的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C程序是运行前直接编译成CPU能执行的机器码,所以非常快。
但是大量的应用程序不需要这么快的运行速度,因为用户根本感觉不出来。例如开发一个下载MP3的网络应用程序,C程序的运行时间需要0.001秒,而Python程序的运行时间需要0.1秒,慢了100倍,但由于网络更慢,需要等待1秒,你想,用户能感觉到1.001秒和1.1秒的区别吗?这就好比F1赛车和普通的出租车在北京三环路上行驶的道理一样,虽然F1赛车理论时速高达400公里,但由于三环路堵车的时速只有20公里,因此,作为乘客,你感觉的时速永远是20公里。
python交互模式
使用当前系统的命令模式,输入python3即可进入交互模式,输入exit()可退出python交互式模式。
交互式模式可以直接显示代码运行的结果。但是之前输入的代码退出交互式模式后不能存到硬盘中
命令行执行.py文件
命令行模式下,进入要执行的.py文件同目录下,输入python3 文件名即可运行
变量的命名规则(标识符)
变量名只能包含字母,数字和下划线,且不能以数字打头;
变量名不能包含空格;
不能将Python 关键字和函数名作为变量名使用;
慎用小写字母i和大写字母O,容易看成数字1和数字0;
Python 的命名是大小写敏感的,也就是说a和A对于解释器而言,是两个不同的名字;
占位符(place holder)
%d %.2f %.1f %s
%d 表示十进制整数占位符
%.2f 表示浮点数保留到2位小数点后
%.1f 表示浮点数保留到1位小数点后
%s 表示字符串
进制
二进制 (binary)1
2
3a = 0b111 #7
#二进制的形式表示7
a = bin(7)
十进制 (decimal)
十六进制 (hexadecimal)1
2
3a = 0xff #255
#十六进制的形式表示255
hex(255)
占位符表示进制1
print("%x" %(255)) #使用16进制的形式表示255
注释
多行注释 “””
单行注释 #
列表 list
list 列表类似Java中的列表list都是类构成
下标的使用如: list[1]、list[-1]
列表的追加如:list.append()
列表的删除如:
del list[x] 直接删除指定索引处的元素
list.pop(x) 弹出指定索引处的元素并返回
list.remove(x) 删除首个指定元素
列表的排序:
list.sort()
列表拷贝
list.copy() 此拷贝不是深层拷贝,如果想要深层拷贝使用copy.deepcopy
数值列表
1 | print("output of range(10):") |
列表的快速生成
1 | matrix = [[0]*8]*10 |
切片(slice)
1 | numbers = [x for x in range(10)] |
切片会生成一个新的list返回,并不是直接操作原有的list
切片可以对str类型的数据使用
妙用切片1
2
3
4
5
6
7numbers = [x for x in range(10)]
numbersCopy = numbers[:]
numbersReversed = numbers[::-1]
print("numbers[:3:-2] is:",numbers[:3:2])
print("numbers[:3:-2] is:",numbers[:3:-2])
将切片的参数划分为[x:y:z]
当z为正数时 x默认为0,y默认为最后一个元素不包含、
当z为负数时 x默认为最后一个值,y默认为第一个值并且包含
数据类型
元组(tuple)
元组是只读的列表
当只有一个数时需要加,如下1
print((1,))
byte字节
字节的作用:用来存储数据方便数据的交流,如字节流
字节的存储Python:
little 高位字节存高地址
big 高位字节存低地址
Intel ARM little endian
Motorola big endian
将数据以二进制字节的方式存储
example:
1 | import struct |
bytearray
1 |
|
可以修改的byte 数组
序列 (sequence)
拥有的共同点:都可以使用索引、切片,并且拥有顺序
如 list tuple str byte bytearray
只读类型
int float str bytes boolean tuple
可修改类型
list bytearray dict
名字绑定 (name binding)
概念名词: 名字(name) 对象(object) 绑定(binding)
例子:q=2
解释就是 将 name q 绑定到 object 2 上
== is
1 | a = 3 |
序列解包(sequence unpack)
x,y,z = ‘x’,’y’,’z’
print(x,y,z)
x,y = y,x
print(x,y)
numbers = 1,2,3
print(type(numbers),numbers)
a,b,c = numbers
print(a,b,c)
d,e,f = 4,5,6
print(d,e,f)
g,h,i = ‘789’
print(g,h,i)
j,k,l = b’\x10\x20\x30’
print(j,k,l)
序列解包,首先解包的对象必须是序列,其次解包时两边数据必须保持一致,不然会报错如下
j,k= b’\x10\x20\x30’
number1,number2 = 1,2,3
print(j,k)
解包元素赋值序列
lstr = “Lenoardo di ser Piero Da Vinci”.split()
first,*middle,last = lstr
print(‘first:’,first,”- middle:”,middle,”- last:”,last)
print(‘first id is:’,id(first),”lstr[1] id is:”,id(lstr[1]))
链式赋值
x = y = 2
布尔型
非空即真,非零即真
for 可迭代对象 iterable object
1 | s = "" |
for else 当for 条件不成立时会触发else 的代码块并执行
1 | for x in names: |
while loop
1 | sum = i = 0 |
带下标的遍历 enumerate
1 | names = ['Tom','Andy','Alex','Dorothy'] |
反向遍历
1 | for x in reversed(names): |
del
1 | x = "Anything" |
exec 执行代码无返回
1 | exec("print('This string was print in exec function')") |
eval evaluation 评估 执行代码有返回
1 | r = eval("3+2-5") |
字符串格式化
1 | import os |
dict
key 必须是可哈希类型 hashable Type
可哈希类型 int float str tuple
不可哈希类型 dict list1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34doroth = dict(name="Dorothy",id = "10003",age = 26)
print(doroth)
d = dict.fromkeys(['id','name','age'],"unknown")
d1 = {}.fromkeys(['id','name','age'],"unknown")
print(d)
print(d1)
dora = {"name":"Dora","id":17,"age":32,"gender":"mate","title":"hello"}
# print(dora['salary'])
print(dora.get("salary",1000))
sTitle = dora.pop('title')
print(sTitle)
print(dora)
dora = {'id':10003,'age':32,'title':'Salas'}
dora2 = {'id':10004,'title':'CEO','gender':'female'}
dora.update(dora2)
print(dora)
for i in dora:
print(i,end=",")
for i in dora.keys():
print(i,end=",")
for key,value in dora.items():
print(key,"-",value)
函数与抽象
Python实现使用函数的案例1
2
3
4
5
6
7
8
9
10
11def costCompute(iStart,iEnd):
"""
计算客户电费,每度电10元
:param iStart: 起始度数
:param iEnd: 最终度数
:return: 电费
"""
iCousume = iEnd - iStart
return iCousume * 10
print(costCompute(100,230))
默认参数(default parameter)
1 | def greeting(n,gender="male"): |
非只读类型的参数
1 | def initPerson(person,id,name,age,gender,title): |
关键字参数调用
1 | def initPerson(person,id,name,age,gender,title): |
任意数量参数
1 |
|
python 全局作用域实现方式
1 | import pprint |
递归 阶乘(factorial)总结不要在大规模的计算中使用递归
1 | def factorial(n): |
面向对象
程序设计语言
1990年前
结构化编程 structured programming
1990年后
面向对象程序语言 object oriented programming
面向对象关键术语:
类型 type or class
对象 object or instance
属性 attribute or data member
方法 method or function
example:1
2
3
4
5
6
7
8
9
10
11
from enum import Enum
class Person:
pass
class Gender(Enum):
mate = 1
female = 0
print(range.__doc__)
文件的读写
example:
1 | # write |
标准输入 标准输出 错误流
example:
1 | import sys |
管道重定向
1 | cat title.txt | python wordCount.py |
结构化文本文件 ini json
example:
1 | import json |
异常、警告
异常勾子 :当系统发生异常时会执行一个指定的函数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25import sys,traceback
from datetime import datetime
def userExceptHook(exceptType,value,traceBack):
fError = open('except_error.log', 'w')
traceList = traceback.format_tb(traceBack)
html = str(datetime.now())+'\n'
html += repr(exceptType)+'\n'
html += repr(value) + '\n'
for i in traceList:
html += i+"\n"
print(html,file=sys.stderr)
print(html,file=fError)
fError.close()
sys.excepthook = userExceptHook
sFirst = input("first number")
sSecond = input("second number")
try:
print(int(sFirst)/int(sSecond))
except Exception as e:
raise
类的序列化 迭代器和生成器函数
类的序列化
1 | class Fibonacci: |
创建可迭代类
迭代器和序列的对比
迭代器,由于是当系统调用next方法时才会生成相应的数据所以在系统资源占用损耗节省方面优于序列,但是不能像序列那样可以随意指定下标取值,并且只能迭代一次.推荐需要依次获取一次数据时使用
序列,由于系统执行后会在系统内部一次性创建完成序列所以系统资源占用损耗节省方面劣于迭代器,但是它可以获取指定下标的值.推荐在重复或指定获取数据的情况下使用
1 | class Fibonacci: |
生成器函数
1 | def fibonacciGenerator(len): |