一、集合操作(set)                                                                                                                          

    1、定义:

set集合,是一个无序且不重复的元素集合。

集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键。集合支持用in和not in操作符检查成员,由len()内建函数得到集合的基数(大小), 用 for 循环迭代集合         的成员。但是因为集合本身是无序的,不可以为集合创建索引或执行切片(slice)操作,也没有键(keys)可用来获取集合中元素的值。

 2、特性:

1、无序

2、去重

3、关系测试

 3、常用操作:

      交集(&)(intersection):两者都存在的      

 >>>a = [1,2,3,4,5]
>>>b = [4,5,6,7,8]
>>>a_set = set(a)
>>>b_set = set(b)
>>>rint(a_set.intersection(b_set))
>>>print(a_set.intersection(b_set),type(a_set.intersection(b_set)))
>>>{4, 5} <class 'set'>#可以看出字典和集合都是{},先将a和b都转成集合,然后求出交集(它们两都有的)

并集(|)(union):去重后所有元素放一起

 >>>a = [1,2,3,4,5]
>>>b = [4,5,6,7,8]
>>>a_set = set(a)
>>>b_set = set(b)
>>>print(a_set.union(b_set))

差集(-)(difference):语法使用规则是你有我没有

 >>>a = [1,2,3,4,5]
>>>b = [4,5,6,7,8]
>>>a_set = set(a)
>>>b_set = set(b)
>>>print(a_set.difference(b_set))#(前后存在顺序问题,a里面有的b里面没有的(有---没有))
>>>print(b_set.difference(a_set))#b里面有的a里面没有

子集(issubset):a是不是b的子集和b是不是a的子集

 >>>a = [1,2,3,4,5]
>>>b = [4,5,6,7,8]
>>>a_set = set(a)
>>>b_set = set(b)
>>>print(a_set.issubset(b_set))
>>>print(b_set.issubset(a_set))
>>>False
>>>False

父集(issuperset):a是不是b的父集和b是不是a的子集

 >>>a = [1,2,3,4,5]
>>>b = [4,5,6,7,8]
>>>a_set = set(a)
>>>b_set = set(b)
>>>print(a_set.issuperset(b_set))
>>>print(b_set.issuperset(a_set))
>>>False
>>>False

        对称差集(^)(symmetric_difference):a和b都互相都没有(去重后放到一起)

 >>>a = [1,2,3,4,5]
>>>b = [4,5,6,7,8]
>>>a_set = set(a)
>>>b_set = set(b)
>>>print(a_set.symmetric_difference(b_set))
>>>{1, 2, 3, 6, 7, 8}
a = [1,2,3,4,5]
b = [4,5,6,7,8]
a_set = set(a)
b_set = set(b)
print(a_set.isdisjoint(b_set))#前后两者存在交集就返回False,没有交集就打印True
解释:
isdisjoint是判断a和b是否存在交集,如果存在返回False,不存在交集返回Trun

        4、基本操作

.add(增加)添加一项

 >>>a = [1,2,3,4,5]
>>>a_set = set(a)
>>>print(a_set)
>>>a_set.add(55)#一次只能添加一个元素,否则会报错
>>>print(a_set)

.update([增加多项])

 >>>a = [1,2,3,4,5]
>>>a_set = set(a)
>>>print(a_set)
>>>a_set.update('','lei','lei')
>>>print(a_set,type(a_set))
>>>{1, 2, 3, 4, 5}
>>>{1, 2, 3, 4, 5, '', 'e', 'l', 'i'} <class 'set'>#通过结果不难看出集合天然去重

.remove('删除')(没有的话报错)

 >>>a = [1,2,3,4,5]
>>>a_set = set(a)
>>>print(a_set)
>>>a_set.remove(1)#一次只能删除一个,否则会报错
>>>print(a_set,type(a_set))

.copy(复制)

>>>a = [1,2,3,4,5]
>>>a_set = set(a)
>>>b_set = a_set.copy()
>>>print(a_set,type(a_set))
>>>print(b_set,type(b_set))
>>>{1, 2, 3, 4, 5} <class 'set'>
>>>{1, 2, 3, 4, 5} <class 'set'>

.pop(删除任意一个并返回这个元素)

 >>>a = [1,2,3,4,5]
>>>a_set = set(a)
>>>b_set = a_set.pop()#随机删除,并返回删除的元素
>>>print(a_set,type(a_set))
>>>print(b_set)
>>>{2, 3, 4, 5} <class 'set'>
>>>1

.discard(删除)(没有不会报错)

 >>>a = [1,2,3,4,5]
>>>a_set = set(a)
>>>b_set = a_set.discard(5)
>>>print(a_set)
>>>print(b_set)
>>>{1, 2, 3, 4}
>>>None#有的话删除后并返回一个None
>>>就算没有,不报错,也只会返回一个None

二、文件操作                                                                                                                                       

       提示:2.7里面的file文件操作3.x没有

      1、标准操作:

f = open("yesterday",'w',encoding="utf-8")#文件句柄(放到了内存什么位置)
f.write("哈哈哈")#写入内容,如果没有该文件就自动创建
f.close#(关闭文件)

2、建议操作:

>>>with open("yesterday","w",encoding='utf-8') as data:#读写完后自动关闭,因为windows上默认的编码是gbk,所以需要转换成utf-8
data.write("哈哈哈")

      3、打开模式:

r,只读模式(默认)。
w,只写模式。(不可读;不存在就自动创建;存在则删除内容)
a,追加模式。(可读; 不存在则创建;存在则只追加内容)
"+" 表示可以同时读写某个文件 r+,可读写文件。【可读;可写;可追加】
w+,写读
a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用) rU
r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

.readlines(读成一个列表,所有内容)#默认每行之间有空行因为有\n,用strip()就行
  .readline(默认一次只读一行)
  .seek#位置0是开始
  .tell#打印当前位置
  .encoding#当前编码
  .readable#文件是否可读
  .writeable#是否可写
  .flush#默认是等内存缓存满了才写入,强刷读一条直接写入硬盘

小练习

 #!/usr/bin/env python
#—*—coding:utf-8—*—
with open("yesterday","r",encoding='utf-8') as data_1 , \
open("yesterdaybak","w",encoding='utf-8') as data_2:#读写完后自动关闭
for line in data_1.readlines():
if "中国石油" in line:
line = line.replace("中国石油","中国石化")
data_2.write(line)
yesterday#文件更改前
新浪
百度
中国石油 yesterdaybak#更改后文件内容
新浪
百度
中国石化

三、字符编码与转码                                                                                                                               

        1、python3练习

打开文件yesterday(windows上),内容如下
新浪
百度
中国石油
>>>with open("yesterday","r") as data:
>>> for line in data:
>>> line = line.strip('\n')
>>> print(line)
报错:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 18: illegal multibyte sequence
解释:
我们知道utf-8是unicode的扩展,windows上默认编码是gbk,按照上图所示打开文件的时候我们需要将gbk转码直接解码(encoding)成utf-8。
如果是python2,.x的话,如果编码格式是gbk,我们首先需要将gbk转码成unicode,然后再将unicode解码(encoding)成utf-8。

四、函数                                                                                                                                             

      1、定义:

        函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

2、特性:

        1、减少重复性

        2、是程序扩展性好

3、使程序更容易维护

3、语法:

 >>>def func():
>>> print("你好中国!")
>>>func()

4、执行顺序:

>>>def func():#1>>#3(首先python程序通过关键字发现这是个函数)(当执行完func()时候又到了这里)
>>> print("你好中国!")#4(最后才执行到这里)
>>>func()#2(然后从上往下,这里执行了上面的函数)

5、函数参数

 #默认参数
def func(x,y):#这里的x和y只是形参(形式参数)
print(x)
print(y)
func(1,2)#这里是实参(实际参数,就是真真切切要往函数体里面传的参数)
#1对应x,2对应y,也就是说实参合形参是平行对应的,否则打印出的效果就相反了。形参和实参不能多也不能少,否则报错。
 #关键参数
def func(x,y,z):
print(x)
print(y)
print(z)
func(x= "中国",y="北京",z = "海淀")
#这样的话就没有了顺序的问题,只是要求形参和实参一定要对应,不能多,也不能少
 #默认参数和关键参数混用
def func(x,y,z=""):#默认参数和关键参数混合使用的时候,关键参数必须在最后
print(x)
print(y)
print(z) func(1,2,z='')#默认参数和关键参数混合使用的时候,关键参数必须在最后。
#如上,z,如果如果没有给传实际参数,默认使用形式参数赋的值,如果实参给了就用实参的参数。

        万能参数一(*)

 #非固定参数(万能参数)
def func(*args):#*是关键指定不可变,args是名称可以更改
print(args[0])
print(args,type(args))
func(1,2,3,4)#通过结果可看出*传进去的是元祖
>>>1
>>>(1, 2, 3, 4) <class 'tuple'>

        万能参数二(**)

 #非固定参数(万能参数**kwargs)
def func(**kwargs):
print(kwargs,type(kwargs))
func(Name = '中国',Age = '上下五千年')
#**因为**输出的是字典,所以传值得时候一定是类似xxx = yyyy形式。

局部变量和全局变量

 name = "china"
def func(*args,**kwargs):
name = "beijing"#注意,局部变量是存在于函数体内的变量,全局变量是不在任何一个函数体内的变量
print(name)#如果局部变量和全局变量同时存在的话,优先使用局部变量
print(args)
print(kwargs)
func(1,2,3,age = "上下五千年")
 #更改全局变量
name = "china"
def func(*args,**kwargs):
global name#引用全局变量的name
print(name)#打印结果肯定是china
name = "Beijing"#修改,这里有点像如果引用一个变量,首先从函数体内找,如果函数体内没有就找全局变量
print(name)
print(args)
print(kwargs)
func(1,2,3,age = "上下五千年")
>>>china
>>>Beijing
>>>(1, 2, 3)
>>>{'age': '上下五千年'}

        6、函数返回值

 要想获取函数的执行结果,就可以用return语句把结果返回

 注意:

 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
如果未在函数中指定return,那这个函数的返回值为None

        7、函数的递归

定义:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
#函数的递归
def info(n):
print(n)
if int(n/2) > 0:
return info(int(n/2))
print(">>>>",n)
info(10)
结果:
10
5
2
1
>>>> 1
递归特性:

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

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

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

8、高阶函数

        变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

def add(x,y,f):#实参将3和-6传给形参
return f(x) + f(y)#返回值首先将3和-6取绝对值(那就是3和6),再相加,结果肯定是9 res = add(3,-6,abs)#abs是内置函数,让的定义简单里面就是去绝对值
print(res)

Python之路-python(set集合、文本操作、字符编码 )的更多相关文章

  1. Python之路Python文件操作

    Python之路Python文件操作 一.文件的操作 文件句柄 = open('文件路径+文件名', '模式') 例子 f = open("test.txt","r&qu ...

  2. python基础之 列表、元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...

  3. 自学Python之路-Python基础+模块+面向对象+函数

    自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的 ...

  4. Python之路Python内置函数、zip()、max()、min()

    Python之路Python内置函数.zip().max().min() 一.python内置函数 abs() 求绝对值 例子 print(abs(-2)) all() 把序列中每一个元素做布尔运算, ...

  5. Python之路Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数

    Python之路Python作用域.匿名函数.函数式编程.map函数.filter函数.reduce函数 一.作用域 return 可以返回任意值例子 def test1(): print(" ...

  6. Python之路Python全局变量与局部变量、函数多层嵌套、函数递归

    Python之路Python全局变量与局部变量.函数多层嵌套.函数递归 一.局部变量与全局变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.全局变量作用域是整个程序,局 ...

  7. 自学Python之路-Python核心编程

    自学Python之路-Python核心编程 自学Python之路[第六回]:Python模块       6.1 自学Python6.1-模块简介    6.2 自学Python6.2-类.模块.包  ...

  8. 自学Python之路-Python并发编程+数据库+前端

    自学Python之路-Python并发编程+数据库+前端 自学Python之路[第一回]:1.11.2 1.3

  9. 自学Python之路-Python网络编程

    自学Python之路-Python网络编程 自学Python之路[第一回]:1.11.2 1.3

随机推荐

  1. TYVJ P3522 &&洛谷 P1135 奇怪的电梯 Label:bfs

    题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N).电梯只有四个按钮:开 ...

  2. xenu工具介绍

    Xenu Link Sleuth 也许是你所见过的最小但功能最强大的检查网站死链接的软件了.你可以打开一个本地网页文件来检查它的链接,也可以输入任何网址来检查.它可以分别列出网站 的活链接以及死链接, ...

  3. BZOJ 3732 题解

    3732: Network Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= 30,000) ...

  4. 开发android过程中eclipse闪退解决

    有一次eclipse崩溃了,然后再双击就无法打开了.换了几个版本也是如此. 后来找到了这个方法:删除文件 [workspace]/.metadata/.plugins/org.eclipse.e4.w ...

  5. 为什么C#不使用多继承?(from stackoverflow)

    简单地说:是因为该语言的设计者决定不使用. 基本上,.NET和Java的设计者不使用多继承(MI),是因为他们认为给语言加上多继承获得的好处较少,抵不上因此增加的复杂性. 1.不同的语言对于多继承如何 ...

  6. The Skins of the Substance

    This blog is about a java jar file : Substance.jar well, you can get it from links as below: http:// ...

  7. Crossing River

    Crossing River 题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=26251 题意: N个人希望去过 ...

  8. (转)as3效率优化

    1.改进算法无论对于那一种程序,好的算法总是非常重要的,而且能够极大地提高程序性能,所以任何性能的优化第一步就是从算法或者说程序逻辑的优化开始,检查自己的程序是否有多余的运算,是否在没有必要的时候做了 ...

  9. HighchartsJS创建环形带标识的图表实例

    HighchartsJS 是一款功能强大.开源.美观.图表丰富.兼容绝大多数浏览器的纯js图表库,目前最新版本库是Highcharts 4.1.9.另外,HighchartsJS还提供很多的插件和第三 ...

  10. 最长递增子序列 O(NlogN)算法

    转自:点击打开链接 最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS. 排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了. 假设存在一个 ...