007-python例子

一天学会python??

参考:https://www.runoob.com/python3/python3-tutorial.html

备忘

实用函数

  • input : 输入
a = input();
a = input("提示语");
  • print :打印到终端
    默认是换行的;末尾加上 ,end="",就可以取消换行。
print(a,end="")

打印多个数值

print(1, "aa")
  • id 函数用于获取内存地址
a = 10
print(id(a))

一、基础

1.1 特点

  • Python 是一种解释型语言
  • Python 是交互式语言
  • Python 是面向对象语言
  • Python 是初学者的语言
  • 易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。
  • 易于阅读:Python代码定义的更清晰。
  • 易于维护:Python的成功在于它的源代码是相当容易维护的。
  • 一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好。
  • 互动模式:互动模式的支持,您可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片断。
  • 可移植:基于其开放源代码的特性,Python已经被移植(也就是使其工作)到许多平台。
  • 可扩展:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那部分程序,然后从你的Python程序中调用。
  • 数据库:Python提供所有主要的商业数据库的接口。
  • GUI编程:Python支持GUI可以创建和移植到许多系统调用。
  • 可嵌入: 你可以将Python嵌入到C/C++程序,让你的程序的用户获得"脚本化"的能力。

1.2 基础语法

1.2.1 编码

默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。

# *-* condig: utf8 *-*

1.2.2 标识符

  • 大小写敏感;
  • 首位字符可以是字母、下划线,但是不能是数字;
  • 其他位的字符可以是字母、下划线、数字;
  • python3支持中文作为标识符

1.2.3 保留字

>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class',
 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 
'import', 'in', 'is','lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try',
 'while', 'with', 'yield']

1.2.4 注释

单行注释用 #
多行注释成对的 ... 或者 ""
例子:

print("OK")
...
这是多行注释
...

1.2.5 行缩进风格

用缩进代表代码块,而不用{},例如:

if true 
  print("OK")
else
  print("not OK")

缩进的小可变,但是同一代码块每行的缩进大小要一致。

1.2.6 多行合并为一行

用反斜杠

a = b+\
c+\
d
# 相当于 a = b+c+d 

1.2.7 数字类型

四种数字类型

  • int:整形
  • boo:布尔
  • float:浮点
  • complex:复数类型,如1+2j

1.2.8 字符串

  • 用单引号或者双引号括起来;
  • 三个引号作为标记,可以多行字符串括起来,例如
a = ''' good
job
'''
print(a)
  • 转义符 \ ,可以加上 r 让转义字符不生效,从而直接打印,例如:
a = r' goodjob\n'
  • 字符串级联,例子:
a = "good" " job"    //相当于 a = "good job"
  • 用 + 连接两个字符串,用 * 使同一个字符串重复
a = ("look"+"a")*2
  • 字符串索引从左到右,是从0开始递增;如果是从右到左,则是从-1开始递减;
  • python没有单个字符的表示,一个字符也用字符串表示;
  • 字符串截取方式:变量[头下表:尾下标:步长]。例子:
a = "Today is a sunny day"
print(a[0:3:2])

1.1.9 空行

函数之间或者类之间用空行隔开,空行也是代码的一部分。

1.1.10 同一行显示多条语句

用 ; 分隔

1.1.11 模块导入

  • 在 python 用 import 或者 from...import 来导入相应的模块。
  • 将整个模块(somemodule)导入,格式为: import somemodule
  • 从某个模块中导入某个函数,格式为: from somemodule import somefunction
  • 从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc
  • 将某个模块中的全部函数导入,格式为: from somemodule import *

1.2 基础数据类型

  • 在 Python 中,变量没有类型,这里的的"类型"是变量在内存中的存储类型;

1.2.1赋值:

 a = 1

多个变量赋值

a = b = c =1
a, b, c = d, e, f 

1.2.2 六种标准的数据类型

Number(数字)
String(字符串)
List(列表)
Tuple(元组)
Set(集合)
Dictionary(字典)
其中
不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。

1.2.3 数字及其运算

  • Python3 支持 int、float、bool、complex(复数)。
  • 类型判断函数 isinstance 和 type
print(isinstance(1, int))
print(type(1))

区别:
type()不会认为子类是一种父类类型。
isinstance()会认为子类是一种父类类型

  • 数值运算
a = 2
b =3
c1 = a + b  
c2 = a - b
c3 = a * b 
c4 = a / b      #除法,得到浮点数
c5 = a // b     #除法,得到整形数
c6 = a % b          
c7 = a ** b     #乘方

1.2.4 字符串

(参见前面)

1.2.5 列表

(1)定义

list = [1,4,5,7]

(2)截取
和字符串类似,语法为 :变量[头下表:尾下标:步长]。其中步长可以省略,省略是,步长默认为1;如果步长是 -1 ,则代表的是逆向读取。

# 逆向读取
a = [1, 2, 3, 4]
print(a[-1:-5:-1])

(3)连接和重复操作
用 + 和 *,例子:

a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
c = (a + b) * 2
print(c)

(4)取得其中的元素
类似于c语言的数组,用 [ ] 符号;和字符串不同的是,列表里的数值是可以更改的。

a = [1, 2, 3, 4]
a[1] = 10

1.2.6 元组(Tuple)

  • 元组和列表类似,但是有个很大的区别是,元组的数值不能被更改;
  • string、list 和 tuple 都属于 sequence(序列);
    (1)定义
t = (1, 2, 3, 4)

(2)元组操作
截取、连接、复制和列表类似

1.2.7 集合(set)

  • 集合(set)是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员;
    (1)定义
  • 建立空集合用set();建立非空集合可用set(),也可用{ }来创建;
  • 建立空的 { },代表的时建立空字典,而不是集合
    (2)赋值、成员测试和集合运算
    和数学的集合类似。例子:
a = {1, 2, 3, 4, 3}
c = {4, 5, 6, 7}
b = a   #赋值会去掉重复的元素
c = a - b   #a和b的差集
c = a + b   #a和b的并集
c = a & b   #a和b的交集
c = a ^ b   #a和b不同时存在的元素集合

1.2.8 字典(Dictionary)

  • 和列表有序对象集合特点相反,字典是无序对象的集合;字典通过 键值来存取,而不是通过有序下标来存取;
  • 键(key)必须使用不可变类型;
  • 在同一个字典中,键(key)必须是唯一的;
  • 字典是一种映射类型,它的元素是键值对。

(1)定义
建立空字典:

dic = {};

建立非空字典:

dic = {"key1":10, "key2":20}

(2)赋值

dic = {}
dic["key1"] = 10

(3)内置函数
clear()、keys()、values()等

dic = {}
dic["key1"] = 10
dic["key2"] = 20
print(dic.keys())

1.2.9 类型转换

函数 描述
int(x [,base]) 将x转换为一个整数
float(x) 将x转换到一个浮点数
complex(real [,imag]) 创建一个复数
str(x) 将对象 x 转换为字符串
repr(x) 将对象 x 转换为表达式字符串
eval(str) 用来计算在字符串中的有效Python表达式,并返回一个对象
tuple(s) 将序列 s 转换为一个元组
list(s) 将序列 s 转换为一个列表
set(s) 转换为可变集合
dict(d) 创建一个字典。d 必须是一个 (key, value)元组序列。
frozenset(s) 转换为不可变集合
chr(x) 将一个整数转换为一个字符
ord(x) 将一个字符转换为它的整数值
hex(x) 将一个整数转换为一个十六进制字符串
oct(x) 将一个整数转换为一个八进制字符串

1.3 运算符

  • 算术运算符
  • 比较(关系)运算符
  • 赋值运算符
  • 逻辑运算符
  • 位运算符
  • 成员运算符
  • 身份运算符
  • 运算符优先级

这些运算符与c语言类似,但有些不同:

(1)算术运算符的 // 和 **
/ : 除法,达到浮点值
// : 除法,得到整形值
** : 阶乘

(2)赋值运算符: 海象运算符
在这个示例中,赋值表达式可以避免调用 len() 两次:

if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")

(3)逻辑运算符
and:与
or:或
not:非

(4)成员运算符
in和not in,例子:

lst = [2, 4, 6, 8]
if( 4 in lst ):
    print("true")
else:
    print("false")

(5)身份运算符
is 和 not is,用于比较两个对象的存储单元。
a is b 相当于 id(a) == id(b),其中id函数是取得内存的地址

a = 10
b = 10
print(a is b)

1.4 数字

(1)复数定义

a = 1 + j

(2)类型转换

  • int(x) 将x转换为一个整数。
  • float(x) 将x转换到一个浮点数。
  • complex(x) 将x转换到一个复数,实数部分为 x,虚数部分为 0。
  • complex(x, y) 将 x 和 y 转换到一个复数,实数部分为 x,虚数部分为 y。x 和 y 是数字表达式。

(3)数学函数

函数 返回值 ( 描述 )
abs(x) 返回数字的绝对值,如abs(-10) 返回 10
ceil(x) 返回数字的上入整数,如math.ceil(4.1) 返回 5
cmp(x, y) 如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。 Python 3 已废弃,使用 (x>y)-(x
exp(x) 返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045
fabs(x) 返回数字的绝对值,如math.fabs(-10) 返回10.0
floor(x) 返回数字的下舍整数,如math.floor(4.9)返回 4
log(x) 如math.log(math.e)返回1.0,math.log(100,10)返回2.0
log10(x) 返回以10为基数的x的对数,如math.log10(100)返回 2.0
max(x1, x2,...) 返回给定参数的最大值,参数可以为序列。
min(x1, x2,...) 返回给定参数的最小值,参数可以为序列。
modf(x) 返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。
pow(x, y) x**y 运算后的值。
round(x [,n]) 返回浮点数 x 的四舍五入值,如给出 n 值,则代表舍入到小数点后的位数。其实准确的说是保留值将保留到离上一位更近的一端。
sqrt(x) 返回数字x的平方根。

(4) 随机函数

函数 描述
choice(seq) 从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。
randrange ([start,] stop [,step]) 从指定范围内,按指定基数递增的集合中获取一个随机数,基数默认值为 1
random() 随机生成下一个实数,它在[0,1)范围内。
seed([x]) 改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设定seed,Python会帮你选择seed。
shuffle(lst) 将序列的所有元素随机排序
uniform(x, y) 随机生成下一个实数,它在[x,y]范围内。

(5)三角函数

函数 描述
acos(x) 返回x的反余弦弧度值。
asin(x) 返回x的反正弦弧度值。
atan(x) 返回x的反正切弧度值。
atan2(y, x) 返回给定的 X 及 Y 坐标值的反正切值。
cos(x) 返回x的弧度的余弦值。
hypot(x, y) 返回欧几里德范数 sqrt(xx + yy)。
sin(x) 返回的x弧度的正弦值。
tan(x) 返回x弧度的正切值。
degrees(x) 将弧度转换为角度,如degrees(math.pi/2) , 返回90.0
radians(x) 将角度转换为弧度

(6)数学常量
pi:圆周率
e:自然对数

1.5 列表

list = [1, 2, 3, 4]

(1)删除列表元素
关键词 del

del list[2]

(2)列表相关的函数和方法

序号 函数
len(list) 列表元素个数
max(list) 返回列表元素最大值
min(list) 返回列表元素最小值
list(seq) 将元组转换为列表

(3)list类下的方法

序号 方法
list.append(obj) 在列表末尾添加新的对象
list.count(obj) 统计某个元素在列表中出现的次数
list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
list.index(obj) 从列表中找出某个值第一个匹配项的索引位置
list.insert(index, obj) 将对象插入列表
list.pop([index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
list.remove(obj) 移除列表中某个值的第一个匹配项
list.reverse() 反向列表中元素
list.sort( key=None, reverse=False) 对原列表进行排序
list.clear() 清空列表
list.copy() 复制列表

1.6 字典

(1)字典内置函数

函数 描述
len(dict) 计算字典元素个数,即键的总数。
str(dict) 输出字典,以可打印的字符串表示。
type(variable) 返回输入的变量类型,如果变量是字典就返回字典类型。

(2)字典内置方法

函数 描述
radiansdict.clear() 删除字典内所有元素
radiansdict.copy() 返回一个字典的浅复制
radiansdict.fromkeys() 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
radiansdict.get(key, default=None) 返回指定键的值,如果键不在字典中返回 default 设置的默认值
key in dict 如果键在字典dict里返回true,否则返回false
radiansdict.items() 以列表返回可遍历的(键, 值) 元组数组
radiansdict.keys() 返回一个迭代器,可以使用 list() 来转换为列表
radiansdict.setdefault(key, default=None) 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
radiansdict.update(dict2) 把字典dict2的键/值对更新到dict里
radiansdict.values() 返回一个迭代器,可以使用 list() 来转换为列表
pop(key[,default]) 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。
popitem() 随机返回并删除字典中的最后一对键和值。

1.7 集合

(1)元素删除
用的是内置方法 remove,例如

s = set((1, 4, 5, 7))
s.remove(5)

(2)集合的内置方法

方法 描述
add() 为集合添加元素
clear() 移除集合中的所有元素
copy() 拷贝一个集合
difference() 返回多个集合的差集
difference_update() 移除集合中的元素,该元素在指定的集合也存在。
discard() 删除集合中指定的元素
intersection() 返回集合的交集
intersection_update() 返回集合的交集。
isdisjoint() 判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False。
issubset() 判断指定集合是否为该方法参数集合的子集。
issuperset() 判断该方法的参数集合是否为指定集合的子集
pop() 随机移除元素
remove() 移除指定元素
symmetric_difference() 返回两个集合中不重复的元素集合。
symmetric_difference_update() 移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。
union() 返回两个集合的并集
update() 给集合添加元素

二、拓展

2.1 流程控制语句

(1)条件判断
关键词 if, 例子:

a = 1
if a == 1:
    print("a is 1")
elif a == 2:
    print("a is 2")
else:
    print("a is know")

(2)while循环
关键词while ,例子:

a = 0
while (a < 10):
    print(a)
    a += 1

(3)for循环
可以遍历任何的序列,例如列表、字符串。
例子:

for x in ["kubo", "is", "a", "stupid", "guy"]:
    print(x, end=" ")

for语句和range函数的结合,例子:

for x in range(5):
    print(x, end=" ")
for x in range(5, 9):
    print(x, end=" ")
for x in range(5, 9, 2):
    print(x, end=" ")

(4)break和continue
和c语言功能一样
(5)pass语句
pass是空语句,是为了保持程序结构的完整性。
pass 不做任何事情,一般用做占位语句
例子:

while(True):
  pass

2.2 迭代器和生成器

  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。- 迭代器只能往前不会后退。
  • 迭代器有两个基本的方法:iter() 和 next()。
  • 字符串,列表或元组对象都可用于创建迭代器:
    (1)创建迭代器对象,并使用next()函数
lst = ["OK", "I", "will", "watch", "out", "you"]
it = iter(lst)
print(next(it), end=" ")
print(next(it), end=" ")
print(next(it), end=" ")

使用for语句和迭代器来遍历序列

lst = ["OK", "I", "will", "watch", "out", "you"]
it = iter(lst)
for x in it:
    print(x, end=" ")

(2)生成器
使用yield函数,例子:

import sys
lst = ["OK", "I", "will", "watch", "out", "you"]
def fun():
    for x in lst:
        a = x
        yield a 
re = fun()
while True:
    try:
        print(next(re), end=" ")
    except StopIteration:
        sys.exit()

在函数里调用yield函数, 返回一个迭代器

2.3 函数

关键字: def、return
(1)语法和定义

def fun(参数列表):
   函数体

return 用于返回数值
(2)例子:

def fun(a, b = 10):
    print(a, b)
fun(1, 2)           #匹配传参
fun(1)              #参数b为默认值
fun(b = 1, a = 2)   #指定传参

(2)不定参数列表

def fun(*var):
    print(var)
fun(1, 2, 3)

参数前面加* 代表传入的是元组
(3)匿名函数
关键字 lambda
用法:

lambda [arg1 [,arg2,.....argn]]:expression

例子:

sum = lambda arg1, arg2: arg1 + arg2
print(sum(1, 2))

2.4 模块

关键字:import、from ... import ...
(1)自定义模块并导入
自建一个 fun.py 文件,内容为:

def sum(a, b):
    return a + b

再建立一个测试脚本t.py

import fun
print(fun.sum(1, 2))

结果表明,t.py可以调用导入模块里的函数
(2)__name__ 属性
一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用name属性来使该程序块仅在该模块自身运行时执行。
例子:

if __name__ == '__name__':
  print("自己在运行")
else:
  print("模块在运行")

(3)内置函数dir()
可以找到模块里定义的所有名称

import fun
dir(fun)

如果dir()不带参数,那么得到的返回值是当前文档的所有定义名称
(4)包

  • 包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。
  • 在导入一个包的时候,Python 会根据 sys.path 中的目录来寻找这个包中包含的子目录。
  • 目录只有包含一个叫做 init.py 的文件才会被认作是一个包,主要是为了避免一些滥俗的名字(比如叫做 string)不小心的影响搜索路径中的有效模块。
    例子:
sound/                          顶层包
      __init__.py               初始化 sound 包
      formats/                  文件格式转换子包
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  声音效果子包
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  filters 子包
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py

2.5 打印

(1)
str(): 函数返回一个用户易读的表达形式。
repr(): 产生一个解释器易读的表达形式。
(2)格式化用法
str.format() 方法,例如:

print('姓名:{}   年龄:"{}"岁'.format("along", 20))
#结果==> 姓名:along   年龄:"20"岁

{ }括号淋面也可以添加序号,代表后面的参数,例如:

print('姓名:{0}   年龄:"{1}"岁'.format("along", 20))
print('姓名:{1}   年龄:"{0}"岁'.format("along", 20)) 
'''结果
姓名:along   年龄:"20"岁
姓名:20   年龄:"along"岁
'''

{ } 里面可以指定对象名,例如:

print('姓名:{name}   年龄:"{age}"岁'.format(name = "along", age = 20))

!a (使用 ascii()), !s (使用 str()) 和 !r (使用 repr()) 可以用于在格式化某个值之前对其进行转化,例如:

import math
print('圆周率:{!r}'.format(math.pi))
#结果==>  圆周率:3.141592653589793

可选项 : 可以定制小数的小数点后的位数,例如

import math
print('圆周率:{!r}'.format(math.pi))
# 结果==> 圆周率:3.142

或者保证某域的空格数一定:

# 这里用到了字典的内置方法 items()
dic = {"god":1, "people":2, "woman":3}
for x,y in dic.items():
    print("{:10}{:10d}".format(x, y))

(3)类似于c风格的格式化
例子:

print("this is a %s" % "string")

2.6 文件操作

(1)文件读写

open(filename, mode)

(2)模式

模式 描述
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
模式 r r+ w w+ a a+
+ + + +
+ + + + +
创建 + + +
覆盖 + +
指针在开始 + + + +
指针在结尾 + +

(3)打开、写入、关闭例子:
注:若果文件不存在,那么系统会在当前路径下创建新的文件

f = open("a.txt", "w")
f.write("I write a setence on file which name is a.txt.");
f.close()

(4)文件读取

f = open("a.txt", "r")
str = f.read()
f.close()
print(str)
  • f.read()
  • f.readline() :读取一行
  • f.readlines() : 读取多行,并且把每一行都分割
    另一种行遍历方式:
f = open("a.txt", "r")
for line in f:
    print(line, end="")
f.close();
  • f.tell() :返回文件指针当前位置
  • f.seek()

(5)pickle 模块
可以将程序运行中的对象存到文件中去。
基本接口:

pickle.dump(obj, file, [,protocol])

有了 pickle 这个对象, 就能对 file 以读取的形式打开:

x = pickle.load(file)

存入:

import pickle
dic = {'a':[1,2,3,4,5],\
       'b':"good job",\
       'c':20\
       }
f = open("a.txt", 'wb')
pickle.dump(dic , f)
f.close()

取出:

import pickle
f = open("a.txt", "rb")
dic = dict(pickle.load(f))
for x,y in dic.items():
    print(x,y)

(6)open的完整参数列表

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

参数说明:

  • file: 必需,文件路径(相对或者绝对路径)。
  • mode: 可选,文件打开模式
  • buffering: 设置缓冲
  • encoding: 一般使用utf8
  • errors: 报错级别
  • newline: 区分换行符
  • closefd: 传入的file参数类型
  • opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。

(7)file对象方法一览表

方法 描述
file.close() 关闭文件。关闭后文件不能再进行读写操作。
file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。
file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False。
file.next() Python 3 中的 File 对象不支持 next() 方法。返回文件下一行。
file.read([size]) 从文件读取指定的字节数,如果未给定或为负则读取所有。
file.readline([size]) 读取整行,包括 "\n" 字符。
file.readlines([sizeint]) 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
file.seek(offset[, whence]) 移动文件读取指针到指定位置
file.tell() 返回文件当前位置。
file.truncate([size]) 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 windows 系统下的换行代表2个字符大小。
file.write(str) 将字符串写入文件,返回的是写入的字符长度。
file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

2.7 OS模块下的文件和目录操作

参考: https://www.runoob.com/python3/python3-os-file-methods.html

  • os.getcwd() :得到当前的路径
  • os.listdir() : 展开目录里的内容

2.8 异常处理

(1)try/except 语句

 try:
        测试代码
except ValueError:
        异常处理
else:
       其他异常情况
finally:
      无论异常是否发生都会执行的代码
  • 一个try对应多个except,对应的ValueError匹配,则执行此异常值下面的代码块
    (2)用户自定义异常
    【待续: https://www.runoob.com/python3/python3-errors-execptions.html】
    (3)主动抛出异常
    语法:
raise [Exception [, args [, traceback]]]

2.9 面向对象

相关概念:
类、方法、类变量、数据成员、方法重写局部变量、实例变量、继承、实例化、对象

(1)类定义

class ClassName:
    
    .
    .
    .
    

(2)类对象
实例化,例子:

class Cl:
    a = 1
    b = 10
    lst = [1, 2, 3, 4]
cl = Cl()
print(cl.a, cl.b, cl.lst)

(3)构造方法__init__()

class Cl:
    def __init__(self, arg_a, arg_b):
        self.a = arg_a
        self.b = arg_b
    lst = [1, 2, 3, 4]

cl = Cl(5, 6)
print(cl.a, cl.b, cl.lst)

其中 self 代表类的实例
(4)类的方法
和一般函数不同,类的方法要包含self这个参数
(5)类的继承
语法

class DerivedClassName(BaseClassName):
    
    .
    .
    .
    

多继承语法:


class DerivedClassName(Base1, Base2, Base3):
    
    .
    .
    .
    

(6)用子类对象调用父类已被覆盖的方法
用 super 函数

class Parent:        # 定义父类
   def myMethod(self):
      print ('调用父类方法')
 
class Child(Parent): # 定义子类
   def myMethod(self):
      print ('调用子类方法')
 
c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法

(7)类的成员私有属性
默认共有属性,成员名 __ 开头的,表示为私有属性,不能被类对象调用。

(8)类的方法
需要包含参数 self,也可以用this,用于表示当前类对象

(9)类的专有方法

__init__ : 构造函数,在生成对象时调用
__del__ : 析构函数,释放对象时使用
__repr__ : 打印,转换
__setitem__ : 按照索引赋值
__getitem__: 按照索引获取值
__len__: 获得长度
__cmp__: 比较运算
__call__: 函数调用
__add__: 加运算
__sub__: 减运算
__mul__: 乘运算
__truediv__: 除运算
__mod__: 求余运算
__pow__: 乘方

(10)运算符重载
例子:

class Sum:
    def __init__(self, x, y):
        self.a = x
        self.b = y
        
    def __str__(self):
        return 'Sum(%d, %d)'%(self.a, self.b)
    
    def __add__(self, other):
        return Sum(self.a + other.a, self.b + other.b)
        
s1 = Sum(10, -4)
s2 = Sum(2, 4)
print(s1+s2)

2.10 命名空间和作用域

  • Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的

(1)命名空间

  • 内置名称(built-in names), Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。
  • 全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
  • 局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)

优先次序:局部 > 全局 > 内置名称

(2)作用域

  • L(Local):最内层,包含局部变量,比如一个函数/方法内部。
  • E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
  • G(Global):当前脚本的最外层,比如当前模块的全局变量。
  • B(Built-in): 包含了内建的变量/关键字等。,最后被搜索

规则顺序: L –> E –> G –>gt; B。

(3)global 和 nonlocal关键字
当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。

2.11 一些模块

  • dir([模块名]) : 列出模块里包含的对象
  • help([模块名]) :返回模块的一些帮助信息

(1)os模块

  • os.getcwd():获得当前路径
  • os.chdir():修改当前路径
  • os.system():调用系统命令

(2)glob模块
通配符搜索例子:

import glob
print(glob.glob("*.py"))

(3)sys模块

  • sys.argv : 命令行参数
  • sys.stderr.write() : 错误重定向

(4)re模块

  • re.findall() : 字符串正则匹配

(5)math模块
包含各类数学函数的运算

(6)访问互联网:urlib模块

from urllib.request import urlopen
f = open("web.html", "wb")
for line in urlopen('https://baidu.com'):
    f.write()
f.close()

(7)datetime模块
例子:

from datetime import date
print(date.today())

(8)zlib模块
压缩数据,例子:

import zlib
s = b"I just woder to know what is your tiny abacus"
print(len(s))
sz = zlib.compress(s)
print(len(sz))
print(zlib.decompress(sz))
print(zlib.crc32(s))

(9)时间度量(timeit)

from timeit import Timer
print(Timer('c = a; a = b; b = c', 'a = 1; b = 2').timeit())
print(Timer('a, b = b, a', 'a = 1; b = 2').timeit())

(10)测试模块(doctest)
例子:

def average(values):
    """Computes the arithmetic mean of a list of numbers.

    >>> print(average([20, 30, 70]))
    20.0
    """
    return sum(values) / len(values)

import doctest
doctest.testmod()  

结果报错,20, 30, 70的平均值是40.0,而非20.0

三、例子

3.1 斐波那契数列

a = 0
b = 1
while (a < 10):
    print(a, end=",")
    a, b = b, a+b

3.2 数字求和

# -*- coding: UTF-8 -*-
 
# Filename : test.py
# author by : www.runoob.com
 
# 用户输入数字
num1 = input('输入第一个数字:')
num2 = input('输入第二个数字:')
 
# 求和
sum = float(num1) + float(num2)
 
# 显示计算结果
print('数字 {0} 和 {1} 相加结果为: {2}'.format(num1, num2, sum))

3.3 秒表

import time

print('按下回车开始计时,按下 Ctrl + C 停止计时。')

while True:
    input("") 
    starttime = time.time()
    print('开始')
    try:
        while True:
            print('计时: ', round(time.time() - starttime, 0), '秒', end="\r")
            time.sleep(1)
    except KeyboardInterrupt:
        print('结束')
        endtime = time.time()
        print('总共的时间为:', round(endtime - starttime, 2),'secs')
        break

3.4 快排

思想: 取其中一个数 num0 作为基准,让剩余的数与 num0,然后根据大小分列两侧;然后那两侧的数用同样的方法,进行分列两侧,直到不能再分。
【其他排序参考: https://www.runoob.com/python3/python3-examples.html】

def partition(arr,low,high): 
    i = ( low-1 )         # 最小元素索引
    pivot = arr[high]     
  
    for j in range(low , high): 
  
        # 当前元素小于或等于 pivot 
        if   arr[j] <= pivot: 
          
            i = i+1 
            arr[i],arr[j] = arr[j],arr[i] 
  
    arr[i+1],arr[high] = arr[high],arr[i+1] 
    return ( i+1 ) 
  
 
# arr[] --> 排序数组
# low  --> 起始索引
# high  --> 结束索引
  
# 快速排序函数
def quickSort(arr,low,high): 
    if low < high: 
  
        pi = partition(arr,low,high) 
  
        quickSort(arr, low, pi-1) 
        quickSort(arr, pi+1, high) 
  
arr = [10, 7, 8, 9, 1, 5] 
n = len(arr) 
quickSort(arr,0,n-1) 
print ("排序后的数组:") 
for i in range(n): 
    print ("%d" %arr[i]),

3.5 抓取小说


##############################
# 获取网络小说  上门女婿叶辰 #
##############################
from urllib.request import urlopen

# 创建或清空文件
def createFile(name):
    f = open(name, "w")
    f.close();

#去掉二进制数据前面的空格
def deleteStrSpace(s):
    s_len = len(s)
    idx = 0;
    for i in range(s_len):
        if s[i] != ord(' '):
            break
        idx += 1
    return s[idx:s_len]

#获取网页内容,并写入文件
def getWebContent(url, file_name):
    f = open(file_name, "ab")
    line_get_en = 0
    for line in urlopen(url):
        line_str = str(line)
        if line_get_en == 0 and line_str.find('

') != -1: line_get_en = 1 continue elif line_get_en == 1 and line_str.find('

') != -1: line_get_en = 0 continue elif line_get_en == 1: f.write(deleteStrSpace(line)) f.close() #网址: https://www.geilwx.com/book/30713/38589713.html page = 38589713 noval_file = 'noval.txt' createFile(noval_file) for i in range(20): getWebContent('https://www.geilwx.com/book/30713/' + str(page) + '.html', noval_file) print('\rtotle page 20,now is ' + str(i + 1), end='') page += 1
##############################
# 获取网络小说  天龙八部     #
##############################
from urllib.request import urlopen

# 创建或清空文件
def createFile(name):
    f = open(name, "w")
    f.close();


#网址:https://www.jinyongwang.net/tian/643.html
#获取网页内容,并写入文件
def webLinePro(s):
    ch1 = '1'
    ch2 = '2'
    ch3 = '3'
    ch4 = '4'
    ret_s = ''
    cnt = 0;
    for ch in s:
        cnt += 1;
        if(cnt <= 2):
            continue
        ret_s += ch
        length = len(ret_s)
        if(ch2 == '<' and ch1 == 'p' and ch == '>'):    
            ret_s = ret_s[0: length - 3]
            #print("match  ", length)
        elif(ch3 == '<' and ch2 == '/' and ch1 == 'p' and ch == '>'):
            ret_s = ret_s[0: length - 4]
            ret_s += '\n'
        elif(ch4 == '<' and ch3 == 's' and ch2 == 'c' and ch1 == 'r' and ch == 'i'):
            ret_s = ret_s[0: length - 5]
            break;
        ch4 = ch3
        ch3 = ch2
        ch2 = ch1
        ch1 = ch
    return ret_s

start_mark = "(adsbygoogle = window.adsbygoogle || []).push({});"
end_mark = "
                    
                    

你可能感兴趣的:(007-python例子)