第三章 函数与变量

第三章 函数与变量 第一课 集合及其运算 集合: 是一个无序的不重复的数据组合 作用: 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='红红火火恍恍惚惚\n' 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'\xe5\x91\xb5\xe5\x91\xb5\xe5\x93\x92... 文件的修改: 代码块: 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\n' %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配置文件

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏公众号_薛勤的博客

Java多线程编程核心技术(三)多线程通信

通过本节可以学习到,线程与线程之间不是独立的个体,它们彼此之间可以互相通信和协作。

13880
来自专栏java达人

多线程设计模式解读1—Guarded Suspension(保护性暂挂模式)

大家好,今天我们给大家介绍一个多线程设计模式的一个概念,我们平时业务代码写得比较多,因此,如果刚上手写比较复杂多线程代码,很有可能会埋下一些坑,而这些坑一时之间...

11040
来自专栏Java架构师历程

JVM加载class文件的原理

当Java编译器编译好.class文件之后,我们需要使用JVM来运行这个class文件。那么最开始的工作就是要把字节码从磁盘输入到内存中,这个过程我们叫做【加载...

54920
来自专栏Java学习网

Java Web中Request对象的52个方法—即查即用

Request表示HttpServletRequest对象,它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session...

31180
来自专栏JackeyGao的博客

Python 高级并发3

本篇主要讲案例, 两个使用Concurrent.futures实现的并发, 一个是多线程, 一个是多进程。

15220
来自专栏CaiRui

Bash Shell 小试牛刀

一、终端打印 [root@cai ~]# echo welcome to bash! welcome to bash! [cairui@cai ~]$ echo...

19260
来自专栏我是攻城师

深入理解Java类加载器机制

Java里面的类加载机制,可以说是Java虚拟机核心组件之一,掌握和理解JVM虚拟机的架构,将有助于我们站在底层原理的角度上来理解Java语言,这也是为什么我们...

41320
来自专栏磨磨谈

CephFS: No space left on device

这是一篇旧闻,由于用cephfs的人还不是很多,所以比较少发关于cephfs相关的东西,最近看到有人开始使用,并且遇到了问题,这个就是其中一个比较容易出的问题,...

30850
来自专栏安恒网络空间安全讲武堂

二进制学习系列-栈溢出之Passcode详解

概念:每一个外部定义的符号在全局偏移表(Global offset Table)中有相应的条目,GOT位于ELF的数据段中,叫做GOT段。

17540
来自专栏zhisheng

Java研发方向如何准备BAT技术面试答案(上)

1. 面向对象和面向过程的区别 面向过程 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Un...

46340

扫码关注云+社区

领取腾讯云代金券