那些年被我坑过的Python——摩拳擦掌(第三章)

集合类型:

  集合类型中的元素是唯一的!

集合的定义与赋值:

1 set_1 = set([1, 3, 5, 7, 2])
2 set_2 = set([2, 4, 6, 8, 3])

集合的运算操作

 1 # 交集
 2 print(set_1.intersection(set_2))
 3 # 并集
 4 print(set_1.union(set_2))
 5 # 差集
 6 print(set_1.difference(set_2))
 7 # 互相差的并集
 8 print(set_1.symmetric_difference(set_2))
 9 # 无交集判定
10 print(set_1.isdisjoint(set([9,11])))
11 # 子集判定
12 print(set([1,3]).issubset(set_1))
13 # 父集判定
14 print(set_1.issuperset(set([1,3])))

集合的增删改查:

 1 # 交集
 2 print(set_1.intersection(set_2))
 3 # 并集
 4 print(set_1.union(set_2))
 5 # 差集
 6 print(set_1.difference(set_2))
 7 # 互相差的并集
 8 print(set_1.symmetric_difference(set_2))
 9 # 无交集判定
10 print(set_1.isdisjoint(set([9,11])))
11 # 子集判定
12 print(set([1,3]).issubset(set_1))
13 # 父集判定
14 print(set_1.issuperset(set([1,3])))
15 
16 # 增加元素:
17 # 如果元素已经存在则不做任何改变
18 set_1.add(3)
19 print(set_1)
20 
21 # 更改更新:
22 # 合并并更新
23 set_1.update(set_2)
24 # 将计算后的结果更新到原集合
25 set_1.difference_update(set_2)
26 set_1.intersection_update(set_2)
27 set_1.symmetric_difference_update(set_2)
28 print(set_1)
29 
30 # 删除元素:
31 # 如果不存在也不报错
32 set_1.discard(9)
33 # 元素不存在时会报错,对比discard()
34 set_1.remove()
35 # 随机删除一个元素
36 set_1.pop()
37 # 清空集合内元素
38 set_1.clear()

文件的操作

    os.path 模块中的路径名访问函数

    分隔

    basename() 去掉目录路径, 返回文件名

    dirname() 去掉文件名, 返回目录路径

    join() 将分离的各部分组合成一个路径名

    split() 返回(dirname(), basename()) 元组

    splitdrive() 返回(drivename, pathname) 元组

    splitext() 返回(filename文件名, extension后缀) 元组

 

    信息

    getatime() 返回最近访问时间

    getctime() 返回文件创建时间

    getmtime() 返回最近文件修改时间

    getsize() 返回文件大小(以字节为单位)

 

    查询

    exists() 指定路径(文件或目录)是否存在

    isabs() 指定路径是否为绝对路径

    isdir() 指定路径是否存在且为一个目录

    isfile() 指定路径是否存在且为一个文件

    islink() 指定路径是否存在且为一个符号链接

    ismount() 指定路径是否存在且为一个挂载点

    samefile() 两个路径名是否指向同个文件

    

    os.path.isdir(name):判断name是不是一个目录,name不是目录就返回false

    os.path.isfile(name):判断name是不是一个文件,不存在name也返回false

    os.path.exists(name):判断是否存在文件或目录name

    os.path.getsize(name):获得文件大小,如果name是目录返回0L

    os.path.abspath(name):获得绝对路径

    os.path.normpath(path):规范path字符串形式

    os.path.split(name):分割文件名与目录(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)

    os.path.splitext():分离文件名与扩展名

    os.path.join(path,name):连接目录与文件名或目录

    os.path.basename(path):返回文件名

    os.path.dirname(path):返回文件路径

 

    os模块中的文件操作:

    1.重命名:os.rename(old, new)

    2.删除:os.remove(file)

    3.列出目录下的文件:os.listdir(path)

    4.获取当前工作目录:os.getcwd()

文件的内置方法:
SN方法以描述
1

file.close()

关闭文件。一个关闭的文件无法读取或写入任何东西。
2

file.flush()

刷新内部缓存,像标准输入fflush。这可能是一些类文件对象的一个空操作。
3

file.fileno()

返回所使用的底层实现,从操作系统I/O操作的整数文件描述符。
4

file.isatty()

如果文件被连接到一个tty(状)装置则返回True,否则返回False。
5

next(file)

返回每次被调用时文件中的下一行。
6

file.read([size])

从文件读取大小最多字节(或更少,如果它们获得大小字节之前读取命中EOF)。
7

file.readline([size])

从文件中读取一整行。结尾的换行符保持的字符串中。
8

file.readlines([sizehint])

读取直到EOF使用 ReadLine()并返回一个包含行的列表。如果可选sizehint参数存在,而不是读取到EOF,全行共计约sizehint字节(四舍五入到内部缓冲区大小后可能)被读取。

9

file.seek(offset[, whence])

设置该文件的当前位置
10

file.tell()

返回文件的当前位置
11

file.truncate([size])

截断文件的大小。 如果size参数存在,则文件被截断为(至多)该尺寸。

12

file.write(str)

将一个字符串写入该文件。没有返回值。
13

file.writelines(sequence)

写入字符串序列到文件。该序列可以是一个迭代对象的字符串 - 典型字符串列表。


打开文件:

# 不需要关闭文件,对文件的操作全部在子代码块中完成即可
with open() as f:
# 下面这种方式需要显式的关闭文件才行
f = open()
f.close()

打开文件的模式有:

  • r,只读模式(默认)。
  • w,只写模式。【不可读;不存在则创建;存在则删除内容;】
  • a,追加模式。【可读;   不存在则创建;存在则只追加内容;】

"+" 表示可以同时读写某个文件

  • r+,可读写文件。【可读;可写;可追加】
  • w+,写读
  • a+,同a

"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)

  • rU
  • r+U

"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

  • rb
  • wb
  • ab

 

读文本文件:  

1 #后两个参数是默认的,可以不加
2 input = open('data', 'r',encoding='utf-8')

 

读二进制文件:  

1 input = open('data', 'rb') 

 

读取所有文件内容:

1 # 直接使用 in 获取文件中的行即可
2 for line in f:
3      print(line.strip())

读每行 :

file_object.readlines()  #不推荐,因为这需要将全部文件内容加载到内存中,如果文件特别大的时候对性能影响很大!

 

读取固定字节 :

1 open('abinfile', 'rb').read(100)

 

函数的定义:

1 # 通过def和()定义函数,()中为函数的参数,定义函数式的参数为形式参数
2 # foo为函数的逻辑代码块
3 # return bar 中的bar为函数的返回值
4 def func(argument1,argument2...):
5      foo
6      return bar

函数的参数,实参与形参:

  如上所述形参就是函数定义时候()中定义的参数名称,而实参是指函数调用时候使用的,实际传入的参数。

函数的位置参数、关键字参数和不固定参数:

  调用函数传入参数的时候,如果不指定关键字,默认是按参数定义的顺序依次传入,这种方式传入的参数称为位置参数;

1 func(1,'xiaoming')

  调用函数时可以根据形参名称使用=将值传入,这种方式称为关键字参数;

1 func(id=1,name='xiaoming')

  不固定参数有两种分别是可传入列表的等价于位置参数的*args,定义形参的时候增加一个*args参数用来接收不固定数量的参数,便于函数的扩展。

1 def func(name,*args):
2     foo
3 
4 func(name='abc',*[1,2,3,4])

  第二种是使用**kwargs来标识,可以接收字典类型的输入,等价于不固定个数的关键词参数的使用。当然这两种方式在函数调用的时候也是需要使用*或者**进行标识。

1 def func(**kwargs)
2 
3 func(**{'id':1,'name':'xiaoming'})

  实参传入的原则:关键字参数不可以在位置参数之前,不固定参数在最后。

 

函数的返回值:

  函数的返回值是区别于过程是编程的一个典型特点,返回值的作用可以是返回函数的状态,可以返回函数的处理结果,还可以调用其他的函数,当然执行return代表着函数全过程的结束。

1 def func(a,b):
2     if foo:
3         return a
4     else:
5         return b

 

高阶函数:

   1、变量可以指向函数;

       2、函数的返回值可以是函数;

       3、一个函数可以接收另一个函数作为参数;

1 def func(a,b,f):
2     return f(a)+f(b)

 

递归特性:

  1、 必须有一个明确的结束条件

  2、 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

  3、 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

 

变量的作用域:

  变量可以分为全局变量和局部变量,全局变量的定义是在函数外,或者使用global 关键词来标识一个变量。

  顾名思义全局变量的作用域是全局,即当前py文件中变量定义位置之后的任何位置,都可以引用这个变量。

  局部变量是指尽在局部生效的变量,比如函数中定义的变量尽在函数内部有效(global标识的除外),这与shell中的变量有很大不同,shell中的变量都是全局变量,函数中如果要标识局部变量还需要使用关键词local,确实很不一样。

 

函数式编程:

  简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。
  它属于"结构化编程"的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。
posted @ 2016-08-11 20:39  虚妖  阅读(273)  评论(0编辑  收藏  举报