第三章 函数与变量

第三章 函数与变量

第一课 集合及其运算
集合:
是一个无序的不重复的数据组合
作用:
1.去重:
代码块:
lit=[2,3,3,3,3,]
lit=set(lit)
print(lit,type(lit))
运行输出:
{2, 3} <class 'set'>
2.关系测试:
代码块:
lt1=set([1,2,3,4,5])
lt2=set([4,5,6,7,8])
print(lt1.intersection(lt2))#交集
print(lt1.union(lt2))#并集
print(lt1.difference(lt2))#差集 lt1里有lt2里没有的
print(lt2.difference(lt1))#差集 lt2里有lt1里没有的
print(lt1.symmetric_difference(lt2))#对称差集 并集-交集
lt3=set([2,3,4])
print(lt3.issubset(lt1))#判断lt3是否为lt1的子集
print(lt1.issuperset(lt3))#判断lt1是否为lt3的父集
#简便写法
print(lt1&lt2)#交集
print(lt1|lt2)#并集
print(lt1-lt2)#差集
print(lt1^lt2)#对称差集
运行输出:
{4, 5}
{1, 2, 3, 4, 5, 6, 7, 8}
{1, 2, 3}
{8, 6, 7}
{1, 2, 3, 6, 7, 8}
True
True
{4, 5}
{1, 2, 3, 4, 5, 6, 7, 8}
{1, 2, 3}
{1, 2, 3, 6, 7, 8}
基本操作:
增:
代码块:
lt=set([1,2,3])
lt.add(4)#用add方法一次只能增加一个元素
lt.update([666,777,888])
print(lt)
运行输出:
{1, 2, 3, 4, 777, 888, 666}
删:
代码块:
lt.remove(666)#一次只能删一个元素
print(lt)
运行输出:
{1, 2, 3, 4, 777, 888}
常用增删,没有改查

第二课 文件的读与写
读:
f=open('yesterday','r',encoding='utf8')
data=f.read()
print(data)
f.close()
用迭代器解决内存读大文件的问题:
for line in f:
print(line)

写(从头写,将以前所有内容都覆盖):
f=open('yesterday01','w',encoding='utf8')
data1='红红火火恍恍惚惚 '
data2='2333333333'
f.write(data1)
f.write(data2)
f.close()
追加:
f=open('yesterday01','a',encoding='utf8')
data3='拳打嘤嘤怪,脚踢竹鼠商'
f.write(data3)
f.close()
输出:
yesterday
产生新文件yesterday01 内容为:
红红火火恍恍惚惚
2333333333拳打嘤嘤怪,脚踢竹鼠商

第三课 文件的操作
tell与seek:
代码块:
f=open('yesterday','r',encoding='utf8')
print(f.tell())#查看光标位置
print(f.readline())#读取一行文件内容
print(f.tell())#查看光标位置
f.seek(0)#将光标移回0位置
print(f.tell())
print(f.readline())
print(f.tell())
f.close()
运行输出:
0
Seems the love I've ever known

32
0
Seems the love I've ever known

32
flush()将内容从内存刷入硬盘,实现进度条
代码块:
import sys,time
for i in range(20):
sys.stdout.write('#')
sys.stdout.flush()
time.sleep(0.1)
扩展:
不常用(硬盘内存机制中有很多坑):
读写模式:f=open('yesterday01','r+',encoding='utf8')
写读模式:f=open('yesterday01','w+',encoding='utf8')
加读模式:f=open('yesterday01','a+',encoding='utf8')
常用(图片歌曲电影等文件):
代码块:
f=open('yesterday01','rb')#不能加编码参数encoding='x'
print(f.readline())
运行输出:
b'xe5x91xb5xe5x91xb5xe5x93x92...
文件的修改:
代码块:
f=open('yesterday02','r',encoding='utf8')
f_new=open('yesterday02new','w',encoding='utf8')
for line in f:
if '等待我去享用' in line:
line=line.replace('等待我去享用','等待pangzi去享用')
print(111)
f_new.write(line)
f.close()
f_new.close()
with语句:实现自动关闭句柄
with open('yesterday01','rb') as f:
print(f.readline())

第四课 字符编码与转码

在pychon3中查看的字符串,都是Unicode的。编码都转为byte。
utf8--(decode)-->unicode--(encode)-->GBK
#utf8转GBK :文件以utf8解码(decode)为Unicode格式打开,再以GBK编码(encode)
utf8<--(encode)--unicode<--(decode)--GBK
#GBK转utf8 :文件以GBK解码(decode)为Unicode格式打开,再以utf8编码(encode)


第五课 函数与函数式编程

编程理念:
1.面向对象:华山派---》类----》class
2.面向过程:少林派---》过程----》def
3.函数式编程:逍遥派---》函数---》def
函数的定义:函数是逻辑结构化和过程化的一种编程方法
def 函数名(x):
#文档描述
x+=1
return x
面向过程:利用函数体,不利用函数返回值
代码块:
import time
def logger():
time_format='%Y-%m-%d %X'
time_current=time.strftime(time_format)
with open('log','a')as f:
f.write('%s end action ' %time_current)
def test1():
print('in the test1')
logger()
def test2():
print('in the test2')
logger()
def test3():
print('in the test3')
logger()
test1()
test2()
test3()
运行输出:
in the test1
in the test2
in the test3
生成文件(log)内容:
2018-01-02 15:11:12 end action
2018-01-02 15:11:12 end action
2018-01-02 15:11:12 end action

函数:
return 返回值:想要函数执行的结果
参数:
def test(x,y,z=3):
#x,y,z叫形参,不占内存的,3叫默认参数,
#如果函数被调用时无对应实参传入,则3充当实参
print(x)
print(y)
test(1,2) #1,2叫实参,真正占内存空间的变量。
不定长参数:
代码块:
def func1(*args):#形参写成*args 可以接收不定长的不同数据类型的实参
print(args)
func1(1,2,3,[4,5,6],(7,8,9),'jqk')
运行输出:#将所有元素组成一个元组
(1, 2, 3, [4, 5, 6], (7, 8, 9), 'jqk')
代码块:
def func2(**kwargs):#形参写成**kwargs 可以接收不定长键值对的实参
print(kwargs)
func2(name='julisha',job='teacher',age=18,sex='female')
运行输出:#将所有键值对组合为一个字典
{'name': 'julisha', 'job': 'teacher', 'age': 18, 'sex': 'female'}
作用域:
代码块:
name='红红火火'
job='老师' #定义全局变量name='红红火火',job='老师'
def change_name(name):
global job #如果想要在函数体内修改全局变量需要加global修饰,且不能当形参
print('before change',name,job)
name='恍恍惚惚' #局部变量的修改只在函数体内有效
job='护士'#对全局变量做了修改
print('after change',name)
change_name(name)
print('afetr function',name,job)
运行输出:
before change 红红火火 老师
after change 恍恍惚惚
afetr function 红红火火 护士 #name没有被修改,job被函数体修改
提醒:虽然可以在函数里改全局变量,但极不推荐这样做
递归:
定义:
在函数体内部,可以调用其他函数。如果一个函数在内部调用自己,就是递归函数。
特性:
1.必须有一个明确的结束条件,默认保护程序设置的递归次数最高990次
2.每深一层递归,问题规模都应比上一次有所减小
3.递归效率不高,次数过高容易溢出栈(stack)
代码块:
def func(n):
print(n)
if int(n)>0:
return func(n/2)
print('--->',n)
func(10)
运行输出:
10
5.0
2.5
1.25
0.625
---> 0.625
高阶函数:
定义:
一个函数接收另一个函数做参数,那么这个函数就称为高阶函数
代码块:
def func(a,b,f):
return f(a)+f(b)
def func1(x):
y=x**2
return y
print(func(2,2,func1))
运行输出:
8
作业:
程序1.实现简单的shell sed 替换功能
需求:
对指定路径下的文件进行内容替换
程序2.修改haproxy配置文件



原文地址:https://www.cnblogs.com/xuepangzi/p/8283253.html