本节内容:html
Python发展历史python
HOW TO RETURN words document: PUT {} IN collection FOR line IN document: FOR word IN split line: IF word not.in collection: INSERT word IN collection RETURN collection
HOW TO用于定义一个函数。一个Python程序员应该很容易理解这段程序。ABC语言使用冒号和缩进来表示程序块。行尾没有分号。for和if结构中也没有括号() 。赋值采用的是PUT,而不是更常见的等号。这些改动让ABC程序读起来像一段文字。尽管已经具有了良好的可读性和易用性,ABC语言最终没有流行起来。在当时,ABC语言编译器须要比较高配置的电脑才能运行。而这些电脑的使用者一般精通计算机,他们更多考虑程序的效率,而非它的学习难度。除了硬件上的困难外,ABC语言的设计也存在一些致命的问题: 可拓展性差。ABC语言不是模块化语言。若是想在ABC语言中增长功能,好比对图形化的支持,就必须改动不少地方。不能直接进行IO。ABC语言不能直接操做文件系统。尽管你能够经过诸如文本流的方式导入数据,但ABC没法直接读写文件。输入输出的困难对于计算机语言来讲是致命的。你能想像一个打不开车门的跑车么?过分革新。ABC用天然语言的方式来表达程序的意义,好比上面程序中的HOW TO 。然而对于程序员来讲,他们更习惯用function或者define来定义一个函数。一样,程序员更习惯用等号来分配变量。尽管ABC语言很特别,但学习难度也很大。传播困难。ABC编译器很大,必须被保存在磁带上。当时Guido在访问的时候,就必须有一个大磁带来给别人安装ABC编译器。这样,ABC语言就很难快速传播。1989年,为了打发圣诞节假期,Guido开始写Python语言的编译器。Python这个名字,来自Guido所挚爱的电视剧Monty Python's Flying Circus。他但愿这个新的叫作Python的语言,能符合他的理想:创造一种C和shell之间,功能全面,易学易用,可拓展的语言。Guido做为一个语言设计爱好者,已经有过设计语言的尝试。这一次,也不过是一次纯粹的hacking行为。linux
pyc 文件:
执行Python代码时,若是导入了其余的 .py 文件,那么,执行过程当中会自动生成一个与其同名的 .pyc 文件,该文件就是Python解释器编译以后产生的字节码。
ps:代码通过编译能够产生字节码;字节码经过反编译也能够获得代码。程序员
python2解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill)web
python3解释器的默认编码为unicode,显然ASCII码没法将世界上的各类文字和符号所有表示,因此,就须要新出一种能够表明全部字符和符号的编码,即:Unicode正则表达式
注:此处说的的是最少2个字节,可能更多算法
因此,python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill),若是是以下代码的话:shell
报错:ascii码没法表示中文数据库
#!/usr/bin/env python print "你好,世界"
改正:应该显示的告诉python解释器,用什么编码来执行源代码,即:编程
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print "你好,世界"
Python有大量的模块,从而使得开发Python程序很是简洁。类库有包括三中:
Python内部提供一个 sys 的模块,其中的 sys.argv 用来捕获执行执行python脚本时传入的参数
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys print sys.argv
单行注视:# 被注释内容
多行注释:""" 被注释内容 """
if... elif... elif ...... else
while(break/continue) else 当跳出循环后执行else语句
for(break/continue) else 当跳出循环后执行else语句
为了更充分的利用内存空间以及更有效率的管理内存,变量是有不一样的类型的,以下所示:
怎样知道一个变量的类型呢?
变量名:由字母、下划线和数字组成,且数字不能开头
result = 值1 if 条件 else 值2
若是条件为真:result = 值1
若是条件为假:result = 值2
python中的字符串在C语言中体现为是一个字符数组,每次建立字符串时候须要在内存中开辟一块连续的空,而且一旦须要修改字符串的话,就须要再次开辟空间,万恶的+号每出现一次就会在内存中从新开辟一块空间。
好比:经常使用的字符串、数字、列表、字典、元组都是来自于其对应的内置类,对应为字符串类str、数字类int、列表类list、字典类dict、元组类tuple...
python2 |
python3 |
_winreg |
winreg |
ConfigParser |
configparser |
copy_reg |
copyreg |
Queue |
queue |
SocketServer |
socketserver |
markupbase |
_markupbase |
repr |
reprlib |
test.test_support |
test.support |
字符串的格式化输出:
下面是完整的,它能够与%符号使用列表:
格式符号 | 转换 |
---|---|
%c | 字符 |
%s | 经过str() 字符串转换来格式化 |
%i | 有符号十进制整数 |
%d | 有符号十进制整数 |
%u | 无符号十进制整数 |
%o | 八进制整数 |
%x | 十六进制整数(小写字母) |
%X | 十六进制整数(大写字母) |
%e | 索引符号(小写'e') |
%E | 索引符号(大写“E”) |
%f | 浮点实数 |
%g | %f和%e 的简写 |
%G | %f和%E的简写 |
age = 18 name = "qinglong"
# 几种格式化输出的方式 print("名字是 %s, 年龄是 %d" % (name, age)) print("名字是 {n}, 年龄是 {a}".format(n=name, a=age)) # 可使用format()函数进行格式化输出 print("名字是 {0}, 年龄是 {1}".format(name, age)) print("名字是 {n}, 年龄是 {a}".format_map({"n": name, "a": age})) # format_map()函数传入的参数是一个字典
python2中raw_input()
python3版本中,没有raw_input()函数,只有input(),而且python3中的input()与python2中的raw_input()功能同样
#!/usr/bin/env python # -*- coding: utf-8 -*- # 将用户输入的内容赋值给 name 变量
#name = raw_input("请输入用户名:") # python2 name = input("请输入用户名:") # python3 # 打印输入的内容 print(name)
输入密码时,若是想要不可见,须要利用getpass 模块中的 getpass方法,即:
#!/usr/bin/env python # -*- coding: utf-8 -*- import getpass # 将用户输入的内容赋值给 name 变量 pwd = getpass.getpass("请输入密码:") # 打印输入的内容 print(pwd)
python支持如下几种运算符
1.算术运算符
下面以a=10, b=20为例进行计算
运算符 | 描述 | 实例 |
---|---|---|
+ | 加 | 两个对象相加a + b 输出结果30 |
- | 减 | 获得负数或是一个数减去另外一个数a - b 输出结果-10 |
* | 乘 | 两个数相乘或是返回一个被重复若干次的字符串a * b 输出结果200 |
/ | 除 | x除以yb / a 输出结果 2 |
// | 取整除 | 返回商的整数部分9//2 输出结果4 , 9.0//2.0 输出结果4.0 |
% | 取余 | 返回除法的余数b % a 输出结果 0 |
** | 幂 | 返回x的y次幂a**b 为10的20次方, 输出结果100000000000000000000 |
>>> 9/2.0 4.5 >>> 9//2.0 4.0
2.赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 赋值运算符 | 把=号右边的结果给左边的变量num=1+2*3 结果num的值为7 |
>>> a, b = 1, 2 >>> a 1 >>> b 2
3.复合赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
+= | 加法赋值运算符 | c += a 等效于c = c + a |
-= | 减法赋值运算符 | c -= a 等效于c = c - a |
*= | 乘法赋值运算符 | c *= a 等效于c = c * a |
/= | 除法赋值运算符 | c /= a 等效于c = c / a |
%= | 取模赋值运算符 | c %= a 等效于c = c % a |
**= | 幂赋值运算符 | c **= a 等效于c = c ** a |
//= | 取整除赋值运算符 | c //= a 等效于c = c // a |
4.经常使用的数据类型转换
函数 | 说明 |
---|---|
int(x [,base ]) | 将x转换为一个整数 |
long(x [,base ]) | 将x转换为一个长整数 |
float(x ) | 将x转换到一个浮点数 |
complex(real [,imag ]) | 建立一个复数 |
str(x ) | 将对象x 转换为字符串 |
repr(x ) | 将对象x 转换为表达式字符串 |
eval(str ) | 用来计算在字符串中的有效Python表达式,并返回一个对象 |
tuple(s ) | 将序列s 转换为一个元组 |
list(s ) | 将序列s 转换为一个列表 |
chr(x ) | 将一个整数转换为一个字符 |
unichr(x ) | 将一个整数转换为Unicode字符 |
ord(x ) | 将一个字符转换为它的整数值 |
hex(x ) | 将一个整数转换为一个十六进制字符串 |
oct(x ) | 将一个整数转换为一个八进制字符串 |
a = '100' # 此时a的类型是一个字符串,里面存放了100这3个字符 b = int(a) # 此时b的类型是整型,里面存放的是数字100 print("a=%d" % b)
5.比较(即关系)运算符
运算符 | 描述 | 示例 |
---|---|---|
== | 检查两个操做数的值是否相等,若是是则条件变为真。 | 如a=3,b=3则(a == b) 为true. |
!= | 检查两个操做数的值是否相等,若是值不相等,则条件变为真。 | 如a=1,b=3则(a != b) 为true. |
<> | 检查两个操做数的值是否相等,若是值不相等,则条件变为真。 | 如a=1,b=3则(a <> b) 为true。这个相似于!= 运算符 |
> | 检查左操做数的值是否大于右操做数的值,若是是,则条件成立。 | 如a=7,b=3则(a > b) 为true. |
< | 检查左操做数的值是否小于右操做数的值,若是是,则条件成立。 | 如a=7,b=3则(a < b) 为false. |
>= | 检查左操做数的值是否大于或等于右操做数的值,若是是,则条件成立。 | 如a=3,b=3则(a >= b) 为true. |
<= | 检查左操做数的值是否小于或等于右操做数的值,若是是,则条件成立。 | 如a=3,b=3则(a <= b) 为true. |
6.逻辑运算符
运算符 | 逻辑表达式 | 描述 | 实例 |
---|---|---|---|
and | x and y | 布尔"与" - 若是x 为False,x and y 返回False,不然它返回y 的计算值。 | (a and b) 返回20。 |
or | x or y | 布尔"或" - 若是x 是True,它返回True,不然它返回y 的计算值。 | (a or b) 返回10。 |
not | not x | 布尔"非" - 若是x 为True,返回False 。若是x 为False,它返回True。 | not(a and b) 返回False |
1.打开文件
在python,使用open函数,能够打开一个已经存在的文件,或者建立一个新文件
open(文件名,访问模式)
访问模式 | 说明 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
w | 打开一个文件只用于写入。若是该文件已存在则将其覆盖。若是该文件不存在,建立新文件。 |
a | 打开一个文件用于追加。若是该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容以后。若是该文件不存在,建立新文件进行写入。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
wb | 以二进制格式打开一个文件只用于写入。若是该文件已存在则将其覆盖。若是该文件不存在,建立新文件。 |
ab | 以二进制格式打开一个文件用于追加。若是该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容以后。若是该文件不存在,建立新文件进行写入。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
w+ | 打开一个文件用于读写。若是该文件已存在则将其覆盖。若是该文件不存在,建立新文件。 |
a+ | 打开一个文件用于读写。若是该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。若是该文件不存在,建立新文件用于读写。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
wb+ | 以二进制格式打开一个文件用于读写。若是该文件已存在则将其覆盖。若是该文件不存在,建立新文件。 |
ab+ | 以二进制格式打开一个文件用于追加。若是该文件已存在,文件指针将会放在文件的结尾。若是该文件不存在,建立新文件用于读写。 |
2.关闭文件
close( )
示例以下:
f = open('test.txt', 'w') # 新建一个文件,文件名为:test.txt f.close() # 关闭这个文件
3.文件的读写
<1>写数据(write)
使用write()能够完成向文件写入数据
示例以下:
f = open('test.txt', 'w') # 打开文件
f.write('hello world, i am here!') # 写入数据
f.close() # 关闭文件
注意:
若是文件不存在那么建立,若是存在那么就先清空,而后写入数据
<2>读数据(read)
使用read(num)能够从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字节),若是没有传入num,那么就表示读取文件中全部的数据
示例以下:
f = open('test.txt', 'r') # 以只读方式打开文件
content = f.read(5) # 读取5个字符 print(content) print("-" * 30)
content = f.read() # 读取剩下的全部 print(content)
f.close()
注意:
若是open是打开一个文件,那么能够不用写打开的模式,即只写 open('test.txt'),默认以只读方式打开
若是读了屡次,那么后面读取的数据是从上次读完后的位置开始的
<3>读数据(readlines)
就像read没有参数时同样,readlines能够按照行的方式把整个文件中的内容进行一次性读取,而且返回的是一个列表,其中每一行的数据为一个元素
# -*- coding:utf-8 -*- f = open('test.txt', 'r') contents = f.readlines() print(type(content)) # 是一个列表,每个元素为一行
i=1 for line in contents: print("%d:%s" % (i, line)) i += 1 f.close()
<4>读数据(readline)
# -*- coding:utf-8 -*- f = open('test.txt', 'r')
content = f.readline() print("1:%s" % content)
content = f.readline() print("2:%s"%content)
f.close()
想想:
若是一个文件很大,好比5G,试想应该怎样把文件的数据读取到内存而后进行处理呢?
制做文件的备份
1 # -*-coding:utf-8 -*- 2 3 oldFileName = input("请输入要拷贝的文件名字:") 4 5 oldFile = open(oldFileName,'r') 6 7 # 若是打开文件 8 if oldFile: 9 10 # 提取文件的后缀 11 fileFlagNum = oldFileName.rfind('.') 12 if fileFlagNum > 0: 13 fileFlag = oldFileName[fileFlagNum:] 14 15 # 组织新的文件名字 16 newFileName = oldFileName[:fileFlagNum] + '[复件]' + fileFlag 17 18 # 建立新文件 19 newFile = open(newFileName, 'w') 20 21 # 把旧文件中的数据,一行一行的进行复制到新文件中 22 for lineContent in oldFile.readlines(): 23 newFile.write(lineContent) 24 25 # 关闭文件 26 oldFile.close() 27 newFile.close()