【python自动化第三篇:python入门进阶】

本节知识点

  1. 集合及其操作
  2. 文件操作
  3. 函数与函数式编程
  4. 递归

一.集合及其操作

   集合(set):把不同的元素组成一起形成集合,是python基本的数据类型。下面是set的基本操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

#set_1 = set([123,345,678])               #创建set
l1 = [11,22,33,44,55]
l2 = [33,44,55,66]
l1_s = set(l1)    #将列表转换成set
l2_s = set(l2)
#####关系测试
#交集:取出两者相同的部分
print(l1_s.intersection(l2_s)) #set([33, 44, 55])
print(l1_s & l2_s) #set([33, 44, 55])
#并集:两者合并起来去重
print(l1_s.union(l2_s)) #set([33, 66, 11, 44, 22, 55])
print(l1_s | l2_s) #set([33, 66, 11, 44, 22, 55])
#差集:两者之间一方有而另一方没有的
print(l1_s.difference(l2_s)) #set([11, 22])
print(l1_s - l2_s) #set([11, 22])
#子集 or 父集:两者有相互包含的关系
print(l1_s.issubset(l2_s)) #子集判断 False
print(l1_s.issuperset(l2_s)) #父集判断 False
#对称差集:去除交集之后剩下的集合元素
print(l1_s.symmetric_difference(l2_s)) #set([66, 11, 22])
print(l1_s ^ l2_s) #set([66, 11, 22])
#二者是否有交集
print(l1_s.isdisjoint(l2_s)) #返回True表示二者无交集,False表示有交集 False

基本操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

l1_s = set([123,456,891,22,33])
#add操作:单独添加一个集合元素的操作(集合也是无序的)
l1_s.add(888)
#update操作:添加多个集合元素
l1_s.update([333,1243,45,2332])
#remove()操作:删除其中的一项
l1_s.remove(45)
#len操作:确定元素个数
print(len(l1_s))
#in操作:成员判断操作
print "x" in l1_s #False
"x" not in l1_s
#pop操作:删除任意的一个,并返回删除的元素
print l1_s  #set([33, 123, 456, 333, 1243, 22, 888, 891, 2332])
print(l1_s.pop())  #33
#discard在指定删除不存在的元素时不会报错(返回None),然而remove会报错
print(l1_s.discard("sdadasd")) #None

二.文件操作  

###文件读取操作
#data = open("yesterday",encoding="utf-8").read()    #读取所有的内容
# f = open("yesterday",encoding='utf-8')
# data = f.read()
# data2 = f.read()
# print(data)
# print("-----》》》",data2)
 
 
###文件写入操作
#写入操作:如果文件不存在则会创建新文件,否则会覆盖原来的文件
# f =open("yesterday","w",encoding='utf-8') 
# f.write("我勒个去!!!")
# f.close()
 
 
###文件追加操作
f = open("yesterday","a",encoding='utf-8')            #追加操作:不能执行读操作
f.write("呵呵呵呵呵\n呵呵呵呵!!!!")
f.close()

读取操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

f = open("yesterday","r",encoding='utf-8')
for i in range(5):
     print(f.readline())        #读取前5行
 
for line in f.readlines():     #readlines()将文件按照列表读取
    print(line.strip())         #去掉空格和换行

比较高效的读取方式:

count = 0
for line in f:
    if count == 9: #读取到第九行,并打印
        print("------分割线---------")
        count += 1
        continue
    print(line.strip())
    count += 1

其他方法:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

f = open("yesterday","r",encoding='utf-8')
print(f.tell())  #读取文件行位置(按字符个数计数的)
#print(f.readline())   #按行读取
print(f.read(5))      #读取前5个字符
print(f.tell())
f.seek(0)       #seek只能够按照字符所在位置返回,不能够按行返回
print(f.encoding) #打印文件编码
print(f.fileno())  #返回文件在内存中的编号
print(f.name)   #打印文件名称
#f.seekable()   #用于终端设备文件读取的移回
print(f.readable())  #判断文件是否可读
print(f.writable()) #判断文件是否可写
print(f.flush())  #将内容从内存刷到硬盘
f.truncate(10)  #截断

文件读写进阶:

   打印进度条程序:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import sys,time
for i in range(50):
    sys.stdout.write("#")
    sys.stdout.flush()
    time.sleep(0.1)

with操作:

with open("yesterday",'r',encoding='utf-8') as f\
        ,open("yesterday2",'w',encoding='utf-8') as f_new:

编码问题:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys

#python 2.7的编码问题
#在cmd上可以,pycharm上不行
print(sys.getdefaultencoding())
s="哈喽啊!!"
s_to_gbk = s.decode('utf-8').encode('gbk')
print(s_to_gbk)
python3的写法:
#!/usr/bin/env python
# -*- coding:gbk -*-
import sys
print(sys.getdefaultencoding())
s = "哈哈哈,好屌啊!!"
s_to_gbk = s.encode('gbk')
print(s_to_gbk)

三、函数式编程

函数和过程:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

# 函数
def fun1():
    '''testing'''
    print("in the func1")
    return 0

# 过程:没有return这个的函数
def func2():
    '''testing2'''
    print("in the funct2!")

x = fun1()
y = func2()
print x #0
print y  #None

 位置参数和关键字调用的使用:

1

2

3

4

5

6

7

8

9

#!/usr/bin/env python

# -*- coding:utf-8 -*-

#Author:wanghui

def test(x,y):

    print(x)

    print(y)

test(1,2#这里的1,2是x,y的位置参数,也叫作实参是内存中实际存在的值,而x,y为形参,不会占内存空间

##所有的形参和实参是一一对应的不能多也不能少

test(x=3,y=4#这是关键字调用的表示方法,要记住关键字调用和位置参数的位置:位置参数要位于关键字调用之前

 默认参数的使用

def test(x,y=2):
    print(x)
    print(y)

参数组的应用 :

#!/usr/bin/env python
# -*- coding:utf-8 -*-

# 第一种参数组:接受N个位置参数转换成元组的方式
def test(*args):
    print(args)

test(2, 3, 45)  # 解决实参不固定的情况下就需要使用参数组来解决这个问题(*args)
#,输出为元组(2, 3, 45)
test(*[1, 2, 34, 5, 6, 432, 23])  # 结合列表 (1, 2, 34, 5, 6, 432, 23)
test([1, 2, 34, 5, 6, 432, 23]) #([1, 2, 34, 5, 6, 432, 23],)

# 第二种参数组
def test1(x, *args):
    print(x)
    print(args)

test1(1, 2, 3, 4, 56, 8, 79, 0)  # 可以传递任意的参数值,传多少都可以
#1
#(2, 3, 4, 56, 8, 79, 0)
test1([1, 2, 34, 5, 6, 432, 23])
# [1, 2, 34, 5, 6, 432, 23]
# ()
test1(*[1, 2, 34, 5, 6, 432, 23])
# 1
# (2, 34, 5, 6, 432, 23)

# 第三种参数组:前俩中都是能转成不同形式(半元组和全元组形式),将N个关键字参数转换成键值对形式存放
# 可以接受字典的参数组
def test2(**kwargs):
    print(kwargs)

# test2(name="alex",age=8,sex="male")  #将N个关键字参数转换成键值对形式存放
test2(**{'name': 'wanghui', 'age': 22})
#{'age': 22, 'name': 'wanghui'}

# 结合位置参数使用
def test3(name, age=23, **kwargs):  # 默认参数要放到参数组之前,否则会报错
    print(name)
    print(kwargs)

# test3('wanghui','cdfv','ewwqd') #这样错误
test3('wanghui', gender="male")
# wanghui
# {'gender': 'male'}

# 结合第一种参数组实验
def test4(name, age=22, *args, **kwargs):
    print(name)
    print(args)
    print(kwargs)

# 结果会返回一个空的元组,因为后面的关键字参数被转成了字典,由于不存在位置参数,所以元组为空
test4('wanghui', age=25, hobby='IT', birthday=1991)
# wanghui
# ()
# {'hobby': 'IT', 'birthday': 1991}

高阶函数:变量可以指向函数

1

2

3

4

5

6

7

#!/usr/bin/env python

# -*- coding:utf-8 -*-

#Author:wanghui

def add(a,b,f):

    return f(a)+f(b)

res = add(3,-6,abs)                       

print(res)

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值