day-008--补充知识点1

补充知识点

感觉大神的漏了点其他基础知识,我这边补上 主要包括以下几个:

  • 迭代器与生成器
  • 输入和输出
  • File(文件) 方法
  • OS 文件/目录方法

1.迭代器和生成器

1.1迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器:
就是把集合的东东塞到容器里去,然后再去处理

这种形式:

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
print (next(it))   # 输出迭代器的下一个元素
print (next(it))

结果:

1
2

如果用的字典的话,输出的是key

把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__()__next__() 。然后需要防止无限循环,需要用StopIteration来实现退出机制

看实例:

dict1 = {1: 2, 'aaa': 'bbb', 123: '123', '123': 123}
it = iter(dict1)
print(dict1)

print(next(it))
for x in it:
    dict1[x] = 'iter'
print(dict1)

class MyIter:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        if self.a >= 5:
            raise StopIteration
        else:
            x = self.a
            self.a += 1
            return x


my_iter = MyIter()
mi = iter(my_iter)
for xx in mi:
    print(xx)

结果:

{1: 2, 'aaa': 'bbb', 123: '123', '123': 123}
1
{1: 2, 'aaa': 'iter', 123: 'iter', '123': 'iter'}
1
2
3
4

第三行输出少了一个'iter',是因为前面执行了netx(),下面for in 的时候,少一个

1.2 生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
这个函数的好处就是执行一次next()才会运行一次,对于超级大的迭代器,降低了计算量

以下实例使用 yield 实现斐波那契数列:

def fibonacci(n):  # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n):
            return
        yield a
        a, b = b, a + b
        counter += 1


f = fibonacci(10)  # f 是一个迭代器,由生成器返回生成

while True:
    try:
        print(next(f), end=" ")
    except StopIteration:
        sys.exit()

结果:

0 1 1 2 3 5 8 13 21 34 55 

这两个知识点先学着

2.输入和输出

2.1输出格式化

Python两种输出值的方式: 表达式语句和 print() 函数。

第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用。

如果你希望输出的形式更加多样,可以使用 str.format() 函数来格式化输出值。

如果你希望将输出的值转成字符串,可以使用 repr()str() 函数来实现。

  • str(): 函数返回一个用户易读的表达形式。
  • repr(): 产生一个解释器易读的表达形式。

主要是怎么用这些函数了输出,看例子吧:

str1 = 'hello world'
print(str(str1))
print(repr(str1))
print(str(1/7))
print(repr(1/7))
print(str(100*100))
print(repr((100*100)))
print(str('aaaa\n'))
print(repr('aaaa\n'))
for x in range(5):
    print(repr(x).rjust(2),repr(x*x).rjust(3),repr(x*x*x).rjust(4))
print('###########################')
for x in range(5):
    print('{0:2d} {1:3d} {2:4d}'.format(x,x*x,x*x*x))

print('123'.zfill(10))
print('{!a}'.format('\n'))

结果:

hello world
'hello world'
0.14285714285714285
0.14285714285714285
10000
10000
aaaa

'aaaa\n'
 0   0    0
 1   1    1
 2   4    8
 3   9   27
 4  16   64
###########################
 0   0    0
 1   1    1
 2   4    8
 3   9   27
 4  16   64
0000000123
'\n'

就是会让输出好看点,强迫症福音

2.2 %形式的格式输出 我也用的比较习惯。。。

就是这个样子的:

import math
print('常量 PI 的值近似为:%5.3f。' % math.pi)

结果:

常量 PI 的值近似为:3.14。

2.3 键盘输入和格式输入

使用input()来通过键盘输入,把结果用str()或者int()转下就是格式输入

就这样:

print(int(input('请快快输入一个整数')))
nInput = input('test int')
if nInput.isnumeric():
    print('you input a num')
else:
    print('you are bad man')

nInput = input('test int')
if nInput.isnumeric():
    print('you input a num')
else:
    print('you are bad man')

结果:

请快快输入一个整数111
111
test int111
you input a num
test int1a1
you are bad man

就这么简单

2.4 读写文件

通过open()来实现,就是这样子,用完就close,养成好习惯

fd = open(filename,mode)
fd.close()

filename 是个找的到的地方,不写路径就在当前执行目录,mode 是模式别较多,列个表:

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

下图很好的总结了这几种模式,借用下

image.png

模式 r r+ w w+ a a+
+ + + +
+ + + + +
创建 + + + +
覆盖 + +
指针在开始 + + + +
指针在结尾 + +

文件的操作方法主要又一下几个

  • f.read() 为了读取一个文件的内容,调用f.read(size), 这将读取一定数目的数据, 然后作为字符串或字节对象返回。size 是一个可选的数字类型的参数。 当 size 被忽略了或者为负, 那么该文件的所有内容都将被读取并且返回。
  • f.readline() 会从文件中读取单独的一行。换行符为 '\n'f.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行。
  • f.readlines() 将返回该文件中包含的所有行。如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割。
  • f.write(string)string写入到文件中, 然后返回写入的字符数。
  • f.tell() 返回文件对象当前所处的位置, 它是从文件开头开始算起的字节数。
  • f.seek()如果要改变文件当前的位置, 可以使用 f.seek(offset, from_what) 函数。from_what的值, 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾,例如:1.seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符;2.seek(x,1) : 表示从当前位置往后移动x个字符;3:seek(-x,2):表示从文件的结尾往前移动x个字符
    其实跟其他语言在文件操作上没太大区别

下面就搞个大的实例:

fd = open('test_file.txt','r')
print('fd.read(2):', fd.read(2))
print('fd.read():', fd.read())
print('fd.readline():', fd.readline())  # 上面的read已经把指针指向了最后,所以读不出来了,要么seek到开始,要么close 后重新来
fd.seek(0,0)
print('fd.readline() after :fd.seek(0,0)', fd.readline())
print('fd.readlines():', fd.readlines())  # 输出其实是个列表的形式
print('fd.tell():', fd.tell())
fd.close()
fd = open('test_file.txt', 'w+')
fd.write('test write')
print('fd.read():', fd.read())  # 一样会跑到最后去
fd.seek(0,0)
print('fd.readline() after :fd.seek(0,0)', fd.readline())
fd.close()

结果:

fd.read(2): te
fd.read(): st write
fd.readline(): 
fd.readline() after :fd.seek(0,0) test write
fd.readlines(): []
fd.tell(): 10
fd.read(): 
fd.readline() after :fd.seek(0,0) test write

其实挺简单,就是不要忘了,用完close,还有文件指针的位置,用readline挺好的

2.5 pickle 模块

python的pickle模块实现了基本的数据序列和反序列化。
通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。

基本接口:

  • pickle.dump(obj, file, [,protocol]) 有了 pickle 这个对象, 就能对 file 以读取的形式打开:
  • x = pickle.load(file)
import pprint, pickle

# 使用pickle模块将数据对象保存到文件
data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}

selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)

output = open('data.pkl', 'wb')

# Pickle dictionary using protocol 0.
pickle.dump(data1, output)

# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)

output.close()



#使用pickle模块从文件中重构python对象
pkl_file = open('data.pkl', 'rb')

data1 = pickle.load(pkl_file)
pprint.pprint(data1)
print(data1)

data2 = pickle.load(pkl_file)
pprint.pprint(data2)
print(data2)

pkl_file.close()

结果:

{'a': [1, 2.0, 3, (4+6j)], 'b': ('string', 'Unicode string'), 'c': None}
{'a': [1, 2.0, 3, (4+6j)], 'b': ('string', 'Unicode string'), 'c': None}
[1, 2, 3, <Recursion on list with id=2738461650504>]
[1, 2, 3, [...]]

有点像是加密了,保存成特殊的文件,然后这个pprint其实可以多打出来一些信息

3. File(文件) 方法

其实和上面的一样的,有点重复了,这个稍微详细点介绍open(),和所有的file的函数

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:

一般我们用两个。。。

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

并没有实例。。。

4. OS 文件/目录方法

主要记录下os 这个模块里都又啥子,上表格,也没有实例,哈哈
其实和linux 命令行很多一一样的,有点像system高级版

序号 方法及描述
1 os.access(path, mode) 检验权限模式
2 os.chdir(path)改变当前工作目录
3 os.chflags(path, flags)设置路径的标记为数字标记。
4 os.chmod(path, mode)更改权限
5 os.chown(path, uid, gid)更改文件所有者
6 os.chroot(path)改变当前进程的根目录
7 os.close(fd)关闭文件描述符 fd
8 os.closerange(fd_low, fd_high)关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略
9 os.dup(fd)复制文件描述符 fd
10 os.dup2(fd, fd2)将一个文件描述符 fd 复制到另一个 fd2
11 os.fchdir(fd)通过文件描述符改变当前工作目录
12 os.fchmod(fd, mode)改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限。
13 os.fchown(fd, uid, gid)修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定。
14 os.fdatasync(fd)强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息。
15 os.fdopen(fd[, mode[, bufsize]])通过文件描述符 fd 创建一个文件对象,并返回这个文件对象
16 os.fpathconf(fd, name)返回一个打开的文件的系统配置信息。name为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准中指定(POSIX.1, Unix 95, Unix 98, 和其它)。
17 os.fstat(fd)返回文件描述符fd的状态,像stat()。
18 os.fstatvfs(fd)返回包含文件描述符fd的文件的文件系统的信息,Python 3.3 相等于 statvfs()。
19 os.fsync(fd)强制将文件描述符为fd的文件写入硬盘。
20 os.ftruncate(fd, length)裁剪文件描述符fd对应的文件, 所以它最大不能超过文件大小。
21 os.getcwd()返回当前工作目录
22 os.getcwdu()返回一个当前工作目录的Unicode对象
23 os.isatty(fd)如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true, 否则False。
24 os.lchflags(path, flags)设置路径的标记为数字标记,类似 chflags(),但是没有软链接
25 os.lchmod(path, mode)修改连接文件权限
26 os.lchown(path, uid, gid)更改文件所有者,类似 chown,但是不追踪链接。
27 os.link(src, dst)创建硬链接,名为参数 dst,指向参数 src
28 os.listdir(path)返回path指定的文件夹包含的文件或文件夹的名字的列表。
29 os.lseek(fd, pos, how)设置文件描述符 fd当前位置为pos, how方式修改: SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算; os.SEEK_END或者2则从文件尾部开始. 在unix,Windows中有效
30 os.lstat(path)像stat(),但是没有软链接
31 os.major(device)从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field)。
32 os.makedev(major, minor)以major和minor设备号组成一个原始设备号
33 os.makedirs(path[, mode])递归文件夹创建函数。像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹。
34 os.minor(device)从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field )。
35 os.mkdir(path[, mode])以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)。
36 os.mkfifo(path[, mode])创建命名管道,mode 为数字,默认为 0666 (八进制)
37 os.mknod(filename[, mode=0600, device])创建一个名为filename文件系统节点(文件,设备特别文件或者命名pipe)。
38 os.open(file, flags[, mode])打开一个文件,并且设置需要的打开选项,mode参数是可选的
39 os.openpty()打开一个新的伪终端对。返回 pty 和 tty的文件描述符。
40 os.pathconf(path, name)返回相关文件的系统配置信息。
41 os.pipe()创建一个管道. 返回一对文件描述符(r, w) 分别为读和写
42 os.popen(command[, mode[, bufsize]])从一个 command 打开一个管道
43 os.read(fd, n)从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。
44 os.readlink(path)返回软链接所指向的文件
45 os.remove(path)删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory。
46 os.removedirs(path)递归删除目录。
47 os.rename(src, dst)重命名文件或目录,从 src 到 dst
48 os.renames(old, new)递归地对目录进行更名,也可以对文件进行更名。
49 os.rmdir(path)删除path指定的空目录,如果目录非空,则抛出一个OSError异常。
50 os.stat(path)获取path指定的路径的信息,功能等同于C API中的stat()系统调用。
51 os.stat_float_times([newvalue])决定stat_result是否以float对象显示时间戳
52 os.statvfs(path)获取指定路径的文件系统统计信息
53 os.symlink(src, dst)创建一个软链接
54 os.tcgetpgrp(fd)返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组
55 os.tcsetpgrp(fd, pg)设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg。
56 os.tempnam([dir[, prefix]])Python3 中已删除。返回唯一的路径名用于创建临时文件。
57 os.tmpfile()Python3 中已删除。返回一个打开的模式为(w+b)的文件对象 .这文件对象没有文件夹入口,没有文件描述符,将会自动删除。
58 os.tmpnam()Python3 中已删除。为创建一个临时文件返回一个唯一的路径
59 os.ttyname(fd)返回一个字符串,它表示与文件描述符fd 关联的终端设备。如果fd 没有与终端设备关联,则引发一个异常。
60 os.unlink(path)删除文件路径
61 os.utime(path, times)返回指定的path文件的访问和修改的时间。
62 os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])输出在文件夹中的文件名通过在树中游走,向上或者向下。
63 os.write(fd, str)写入字符串到文件描述符 fd中. 返回实际写入的字符串长度
64 os.path 模块获取文件的属性信息。

好多。。。

文集传送门 学习python100天


整个学习python100天的目录传送门


无敌分割线


再最后面附上大神的链接这篇跟大神无关,没有对应传送门

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,423评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,339评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,241评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,503评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,824评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,262评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,615评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,337评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,989评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,300评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,829评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,193评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,753评论 3 230
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,970评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,708评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,295评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,207评论 2 258

推荐阅读更多精彩内容

  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,678评论 0 8
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,512评论 0 38
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,330评论 0 4
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,618评论 0 10
  • # Python关键字 部分单词没有分类整理按照顺序整理的 ``` statements语句 print输出 qu...
    ZhouLang阅读 533评论 0 0