导航

python学习笔记(3)

Posted on 2018-03-06 10:31  stumn  阅读(145)  评论(0)    收藏  举报

1.集合:

集合是无序的,不重复的数据组合。

作用:1>去重:把一个列表变成集合,自动去重;

   2>关系测试:测试两组数据之间的交集,差集,并集等。

创建新集合:

 1 list = {1, 2, 3 ,4, 5}
 2 print(list, type(list))
 3 #列表
 4 list_1 = [1, 2, 3, 4]
 5 list_1 = set(list_1)
 6 print(list_1, type(list_1))
 7 #字典
 8 list_2 = {1: 'one', 2: 'two'}
 9 list_2 = set(list_2)
10 print(list_2, type(list_2))
11 
12 input:
13 {1, 2, 3, 4, 5} <class 'set'>
14 {1, 2, 3, 4} <class 'set'>
15 {1, 2} <class 'set'>

有关集合的方法:

1.1.集合运算

 1 list_1 = {1, 3, 5, 6, 7}
 2 list_2 = {1, 2, 3, 4, 5}
 3 list_3 = {1, 3}
 4 list_4 = {2, 4}
 5 
 6 #交集
 7 print(list_1.intersection(list_2))    {1, 3, 5}
 8 print(list_2.intersection(list_1))    {1, 3, 5}
 9 print(list_1 & list_2)                {1, 3, 5}
10 
11 #并集
12 print(list_1.union(list_2))    {1, 2, 3, 4, 5, 6, 7}
13 print(list_2.union(list_1))    {1, 2, 3, 4, 5, 6, 7}
14 print(list_1 | list_2)         {1, 2, 3, 4, 5, 6, 7}
15 
16 #差集
17 print(list_1.difference(list_2))   {6, 7}
18 print(list_2.difference(list_1))   {2, 4}
19 print(list_1 - list_2)             {6, 7}
20 print(list_2 - list_1)             {2, 4}
21 
22 #判断子集
23 print(list_3.issubset(list_1))   True
24 print(list_3 <= list_1)          True
25  
26 #判断父集
27 print(list_1.issuperset(list_3))   True
28 print(list_1 >= list_3)            True
29 
30 #对称差集
31 print(list_1.symmetric_difference(list_2))   {2, 4, 6, 7}
32 print(list_1 ^ list_2)                       {2, 4, 6, 7}
33 
34 #没有交集的时候返回True
35 print(list_1.isdisjoint(list_4))   True

1.2.其余操作

 1 #浅copy
 2 list_5 = list_1.copy()
 3 print(list_5)
 4 
 5 #添加
 6 list_3.add(5)   #只能添加一项
 7 print(list_3)
 8 list_4.update([0, 1, 9])  #添加多项
 9 print(list_4)
10 
11 #删除
12 list_3.pop()   #任意删除
13 list_3.remove(1)   #删除给定的任一项
14 list_3.discard(1)   #删除给定的任一项
15 
16 #长度
17 len(list_4)

对于x in [ ]或者x not in [ ],其中的[ ]可以是列表,集合,字典或者字符串。 

2.文件读写详解

2.1. 文件的读出:其中 r-读写, w-创建新文件覆盖原有的, a-追加, r+ - 读写追加, w+ 写读, b-二进制文件

 1 #直接读取
 2 data = open('test', 'r', encoding='utf-8').read()
 3 
 4 #创建句柄(文件句柄对文件进行操作,将在内存中打开的文件赋值)
 5 f = open('test', 'r', encoding='utf-8')
 6 data = f.read()
 7 data2 = f.read()
 8 print(data)
 9 print('--------')
10 print(data2)   #此处什么也读不到,因为读的第一遍光标在文件末尾
11 
12 # readline
13 f = open('test', 'r', encoding='utf-8')
14 for i in range(2):   #读取前两行
15     print(f.readline().strip()) #同时读取了每一行结尾的回车
16 
17 #readlines
18 f = open('test', 'r', encoding='utf-8')
19 for line in f.readlines():
20     print(line.strip())
21 
22 #第三行特殊打印,但这种方式只适用于小文件(直接从硬盘读到内存)
23 for index, line in enumerate(f.readlines()):
24     if index == 2:
25         print('********')
26         continue
27     print(line.strip())
28 
29 #一行一行的读取,内存中只保存一行(迭代器),这种方式效率很高
30 count = 0
31 for line in f:
32     count += 1
33     if count == 3:
34         print('********')
35         continue
36     print(line.strip())

2.2. 关于文件的方法

 1 #一般文件先写到缓存,到达大小时才会写到硬盘
 2 #f.flush()强制刷新
 3 #这是一个简单的进度条程序
 4 import sys,time
 5 for i in range(20):
 6     sys.stdout.write("#")  #stdout标准输出(屏幕)
 7     sys.stdout.flush()
 8     time.sleep(0.3)
 9 
10 #怎么将光标返回去?
11 f = open('test', 'w', encoding='utf-8')
12 print(f.tell())      #打印文件光标的位置
13 print(f.readline().strip())
14 print(f.readline().strip())
15 print(f.tell())
16 f.seek(0)            #将光标移动到某地方
17 print(f.readline().strip())
18 print(f.readline().strip())
19 
20 #文件的编码
21 print(f.encoding)
22 
23 #Return the underlying file descriptor (an integer).
24 print(f.fileno())
25 
26 #是否是终端设备
27 print(f.isatty())
28 
29 #是否可移动
30 print(f.seekable())
31 
32 #是否可读
33 print(f.readable())
34 
35 #是否可写
36 print(f.writable())
37 
38 #判断是否关闭
39 print(f.closed)
40 
41 #清空文件
42 f.truncate(0)

2.3. with open() as f:执行完后整个程序就关闭

2.4.文件的修改:

  a. 在硬盘中直接修改会覆盖,所以全部加载到内存中修改,修改完成后写回文件;

  b.修改后写到新文件(边读边修改边写)。

Because i love you.
So i want to hold you.
Because i love you.
So there is nothing i can do.


f = open('profile','r')
f_new = open('rewrite', 'w')
for line in f:
    if "Because i love you." in line:
        line = line.replace("Because i love you.", "Because you are my life.")
    f_new.write(line)
f.close()
f_new.close()


Because you are my life.
So i want to hold you.
Because you are my life.
So there is nothing i can do.
View Code

3.编码

暂略

4.全局变量与局部变量

不要在函数内部修改全局变量。(一般都不会这么干,我只是为了强调下一句)

只有字符串,数字简单的不能被修改,复杂的数据结构比如列表,字典,集合等皆可以被修改。

5.递归

递归特性:

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

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

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

 1 def mil(n):
 2     print(n)
 3     if int(n/2) > 0:
 4         return mil(int(n/2))
 5     print('---',n)
 6 mil(5)
 7 
 8 5
 9 2
10 1
11 --- 1
View Code