跟着ALEX 学python day3集合 文件操作 函数和函数式编程
声明 :
文档内容学习于
http://www.cnblogs.com/xiaozhiqi/
一、 集合
集合是一个无序的,不重复的数据组合,主要作用如下
1.去重 把一个列表变成集合 ,就自动去重了
2.关系测试,测试2组数据的之前的交集,差集,并集等关系
去重,直接将列表变成集合
[root@master day3]# cat set.py
#!/usr/bin/env python3
list = [1,2,5,8,5,6,7,7]
list = set(list)
print (list,type(list))[root@master day3]# ./set.py
{1, 2, 5, 6, 7, 8} <class 'set'> #直接去重了
交集, intersection 。 就是将2个列表中,相同的取出来
下面list 和list2中 5和 8是重复,可以直接将他们取出。
[root@master day3]# cat set.py
#!/usr/bin/env python3list = [1,2,5,8,5,6,7,7]
list = set(list)
list2 = set([5,555,256,777,8])
print ( list.intersection(list2))[root@master day3]# ./set.py
{8, 5}
并集(合集), union 2个列表合并去重
[root@master day3]# cat set.py
#!/usr/bin/env python3list = [1,2,5,8,5,6,7,7]
list = set(list)
list2 = set([5,555,256,777,8])
print ( list.union(list2))[root@master day3]# ./set.py
{256, 1, 2, 5, 6, 7, 8, 777, 555}
差集,difference 就是2个列表,对比。打印独有部分
[root@master day3]# cat ./set.py
#!/usr/bin/env python3
list = [1,2,5,8,5,6,7,7]
list = set(list)
list2 = set([5,555,256,777,8])
print ( list.difference(list2)) #将list和list2对比。打印只有list中独有的部分[root@master day3]# ./set.py
{1, 2, 6, 7}
对称差集
就是将2个列表中,相互没有的都取出来了。
[root@master day3]# cat ./set.py
#!/usr/bin/env python3
list = [1,2,5,8,5,6,7,7]
list = set(list)
list2 = set([5,555,256,777,8])
print ( list.symmetric_difference(list2))[root@master day3]# ./set.py
{256, 1, 2, 6, 7, 777, 555}
子集,父集
是否存在包含的关系
[root@master day3]# cat ./set.py
#!/usr/bin/env python3list = [1,2,5,8,5,6,7,7]
list3 = set([1,7])list = set(list)
list2 = set([5,555,256,777,8])print ( list.issubset(list2)) #子集,是否被包含
print ( list3.issubset(list))
print ( list.issuperset(list2)) #父集,是否包含
print ( list.issuperset(list3))[root@master day3]# ./set.py
False
True
False
True
判断是否有交集 isdisjoint
如果2个列表没有交集, 就返回ture。
[root@master day3]# cat set.py
#!/usr/bin/env python3list = [1,2,5,8,5,6,7,7]
list = set(list)
list2 = set([5,555,256,777,8])
list3 = set([1,6])
print ( list3.isdisjoint(list))
print ( list3.isdisjoint(list2))[root@master day3]# ./set.py
False
True
也可以使用以下字符串进行操作
s | t s和t的并集
s & t s和t的交集
s - t 求差集
s ^ t 求对称差集
len(s) 集合中项数
max(s) 最大值
min(s) 最小值
添加
add 添加一项
[root@master day3]# cat set.py
#!/usr/bin/env python3list = [1,2,5,8,5,6,7,7]
list = set(list)
list.add("ssdd")print ( list )
[root@master day3]# ./set.py
{1, 2, 5, 6, 7, 8, 'ssdd'}
update 添加多项
[root@master day3]# cat set.py
#!/usr/bin/env python3list = [1,2,5,8,5,6,7,7]
list = set(list)
list.update([555,666,888])
print ( list )[root@master day3]# ./set.py
{1, 2, 5, 6, 7, 8, 555, 888, 666}
删除
remove,因为集合本生就是去重的,所以,删除的话。就是都删除了 。
[root@master day3]# cat set.py
#!/usr/bin/env python3list = [1,2,5,8,5,6,7,7]
list = set(list)
list.remove(2)
print ( list )[root@master day3]# ./set.py
{1, 5, 6, 7, 8}
pop 随机删除 。
[root@master day3]# cat set.py
#!/usr/bin/env python3list = [1,2,5,8,5,6,7,7]
list = set(list)
list.pop()
print (list)[root@master day3]# ./set.py
{2, 5, 6, 7, 8}
discard
也是删除,和remove相似,但是remove指定一个不存在的值的时候会报错、discard不会报错
[root@master day3]# cat set.py
#!/usr/bin/env python3list = [1,2,5,8,5,6,7,7]
list = set(list)list.discard(555) #指定不存在的值,程序也不会报错。
list.discard(8)print (list)[root@master day3]# ./set.py
{1, 2, 5, 6, 7}
文件操作
文件操作步骤
1. 打开文件
2.通过文件句柄进行操作
3.关闭文件
基本的文化操作
读取文件
linux中
当文件和脚本在同一个目录下时, 可以直接打开
[root@localhost python]# ls
dictionary.py file_op.py guess.py name2.py name.py tuple.py yesterday.txt
[root@localhost python]# cat file_op.py
#!/usr/bin/env python3data = open ("yesterday.txt").read() #直接打开文件
print (data)
[root@localhost python]#
windows中
因为windows 默认是 GBK的编码格式, 所以在windows中打开的话。需要定义编码字符集
# Author rickydata = open("yesterday",encoding="utf-8" ).read() # 定义字符集print (data )
否则会报错
Traceback (most recent call last):File "E:/个人/python/day3/file_op.py", line 3, in <module>data = open("yesterday").read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 124: illegal multibyte sequence
这是读取了文件,一般情况下,如果要修改。就是会将打开这个文件写成一个变量。
f = open("yesterday",encoding="utf-8")data = f.read()print (data )
f.close() # 关闭文件
然后读取文件的话,其实就是加载文件到内存中。 然后你的程序的光标,其实就是第一次读的内存指针。所以当有第二个变量指过去的时候。其实还是现实是之前的内存指针。
[root@localhost python]# cat yesterday.txt
aaaaaa
bbbbbb
ccccc
[root@localhost python]# cat ./file_op.py
#!/usr/bin/env python3f = open ("yesterday.txt")data = f.read()
data2 = f.read()
print ( data )
print ( "data2==============", data2 )
[root@localhost python]# ./file_op.py
aaaaaa
bbbbbb
cccccdata2==============
逐行读取 readline
read是读取全部文件, readline 是逐行读取
[root@master day3]# cat yesterday.txt
seems the love I've known,
看起来我所知道的爱情
has always been the most destructive kind.
好像总是变成破坏性的那种
I guess that's why now I feel so old before my time.
我猜这就是为什么我感到如此苍老,比起我的真实年龄
Yesterday When I was young
往日当我还年轻时
The taste of life was sweet
生命的感受如此美好
As rain upon my tongue
就像雨滴滴落我的舌尖
I teased at life as if
[root@master day3]# cat file_op.py
#!/usr/bin/env python3f = open("yesterday.txt")
print (f.readline())
[root@master day3]# ./file_op.py
seems the love I've known,
读取前5行
可以用for循环+ readline实现
[root@master day3]# cat file_op.py
#!/usr/bin/env python3f = open("yesterday.txt")for i in range(5):print (f.readline())f.close()
[root@master day3]# ./file_op.py
seems the love I've known,看起来我所知道的爱情has always been the most destructive kind.好像总是变成破坏性的那种I guess that's why now I feel so old before my time.
打印全部文件
可以直接用for进行循环
这种循环效率最好。他就是加载一行,打印一行,然后内存中再去除一行 。
[root@master day3]# cat file_op.py
#!/usr/bin/env python3f = open("yesterday.txt")
for i in f:print ( i.strip() )f.close()
[root@master day3]# ./file_op.py
seems the love I've known,
看起来我所知道的爱情
has always been the most destructive kind.
好像总是变成破坏性的那种
I guess that's why now I feel so old before my time.
我猜这就是为什么我感到如此苍老,比起我的真实年龄
Yesterday When I was young
往日当我还年轻时
The taste of life was sweet
生命的感受如此美好
As rain upon my tongue
就像雨滴滴落我的舌尖
I teased at life as if
指定打印到某一行。 将这行进行输出(---------)。
可以自己写个计数器,然后进行判断
[root@master day3]# cat file_op.py
#!/usr/bin/env python3f = open("yesterday.txt")
count = 0
for i in f :if count == 5:print ("=====================")print ( i.strip() )count += 1f.close()
[root@master day3]# ./file_op.py
seems the love I've known,
看起来我所知道的爱情
has always been the most destructive kind.
好像总是变成破坏性的那种
I guess that's why now I feel so old before my time.
=====================
我猜这就是为什么我感到如此苍老,比起我的真实年龄
Yesterday When I was young
往日当我还年轻时
The taste of life was sweet
生命的感受如此美好
As rain upon my tongue
就像雨滴滴落我的舌尖
I teased at life as if
打印5到 10行
[root@master day3]# cat file_op.py
#!/usr/bin/env python3f = open("yesterday.txt")
count = 0for i in f :if count >= 5 and count <= 10 :print ( i.strip() )count += 1f.close()
[root@master day3]# ./file_op.py
我猜这就是为什么我感到如此苍老,比起我的真实年龄
Yesterday When I was young
往日当我还年轻时
The taste of life was sweet
生命的感受如此美好
As rain upon my tongue
还有一种方法
可以使用readlines
注意 是readlines 不是readline。
readlines 将文件内容,变成了列表。 所以他每次都会将整个文件进行转换。 如果是大文件。会影响性能。所以不推荐。
但是 , 因为列表有下标。 所以。在处理小文件的时候。 可能会写起来方便点。 但是不推荐。
[root@master day3]# cat file_op.py
#!/usr/bin/env python3f = open("yesterday.txt")for i in f.readlines():print ( i.strip() ) # 可以使用 strip 去掉多于的空行和空格 f.close()
[root@master day3]# ./file_op.py
seems the love I've known,
看起来我所知道的爱情
has always been the most destructive kind.
好像总是变成破坏性的那种
I guess that's why now I feel so old before my time.
我猜这就是为什么我感到如此苍老,比起我的真实年龄
Yesterday When I was young
往日当我还年轻时
The taste of life was sweet
生命的感受如此美好
As rain upon my tongue
就像雨滴滴落我的舌尖
I teased at life as if
指定打印到某一行。 将这行进行输出(---------)。
其实 readlines 是将文件变成了 列表。 所以每个元素都是都下标。我们可以使用下标进行判断,来实现。
[root@master day3]# cat file_op.py
#!/usr/bin/env python3f = open("yesterday.txt")for index,line in enumerate(f.readlines()):if index == 5 :print ( "-------------------------" )print ( line.strip() )f.close()
[root@master day3]# ./file_op.py
seems the love I've known,
看起来我所知道的爱情
has always been the most destructive kind.
好像总是变成破坏性的那种
I guess that's why now I feel so old before my time.
-------------------------
我猜这就是为什么我感到如此苍老,比起我的真实年龄
Yesterday When I was young
往日当我还年轻时
The taste of life was sweet
生命的感受如此美好
As rain upon my tongue
就像雨滴滴落我的舌尖
I teased at life as if
这样也可以实现,打印5-10的内容
注意下标是从 0 开始的。 所以要算好行数。
[root@master day3]# cat file_op.py
#!/usr/bin/env python3f = open("yesterday.txt")for index,line in enumerate(f.readlines()):if index > 5 and index < 10:print ( index , line.strip() )
f.close()
[root@master day3]# ./file_op.py
6 Yesterday When I was young
7 往日当我还年轻时
8 The taste of life was sweet
9 生命的感受如此美好
写文件
在python中。 如果打开文件后,需要制定操作类型, 读了 就不能写。 写了就不能读。
r 读取文件
[root@localhost python]# cat file_op.py
#!/usr/bin/env python3f = open ("yesterday.txt","r")data = f.read()
data2 = f.read()print ( data )
print ( "data2==============", data2 )
[root@localhost python]# ./file_op.py
aaaaaa
bbbbbb
cccccdata2==============
w 写文件
这边需要注意,写文件的话,w参数每次写都是覆盖。 会将原本的文件内容删除。
[root@localhost python]# cat yesterday.txt
aaa
bbb
ccc
[root@localhost python]# cat file_op.py
#!/usr/bin/env python3f = open ("yesterday.txt","w")
f.write ("123456789")
[root@localhost python]# ./file_op.py
[root@localhost python]# cat yesterday.txt
123456789[root@localhost python]#
同时 他也可以创建新的文件
[root@localhost python]# ls
dictionary.py file_op.py guess.py name2.py name.py tuple.py yesterday.txt
[root@localhost python]# cat file_op.py
#!/usr/bin/env python3f = open ("tomorrow.txt","w")
f.write ("123456789")
[root@localhost python]# ./file_op.py
[root@localhost python]# ls
dictionary.py file_op.py guess.py name2.py name.py tomorrow.txt tuple.py yesterday.txt
a append 追加写
[root@localhost python]# cat yesterday.txt
123456789[root@localhost python]# cat file_op.py
#!/usr/bin/env python3f = open ("yesterday.txt","a")f.write ("ppp\n")
f.write ("ooo\n")
[root@localhost python]# ./file_op.py
[root@localhost python]# cat yesterday.txt
123456789ppp
ooo
其他的一些使用方法
tell
就是告诉你现在的文件指针位置的。 注意:它不是按行来算的,是字符串的位置来算的。
[root@master day3]# cat file_op.py
#!/usr/bin/env python3f = open("yesterday.txt")print (f.tell())
print(f.readline().strip())
print (f.tell())
f.close()
[root@master day3]# ./file_op.py
0
seems the love I've known,
27
seek
指定文件指正到固定位置。实际情况中,因为使用中,因为你不能确定,具体的字符串的位置。所以一般都是指向0。
[root@master day3]# cat file_op.py
#!/usr/bin/env python3f = open("yesterday.txt")print (f.tell())
print(f.readline().strip())
print (f.tell())
f.seek(0)
print (f.tell())
print(f.readline().strip())
f.close()[root@master day3]# ./file_op.py
0
seems the love I've known,
27
0
seems the love I've known,
flush
一般我们写,读文件都是先存储到内存中的 ,当到了一定的量之后,它才会写到磁盘上面。 flush就是可以使 立刻将内存中的内容写到磁盘上面。
这个在window上进行测试
E:\>python
Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (
AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open("111.txt",'w')
>>> f.write("hello")
再次打开,发现文件还是空的。
这个时候输入
>>> f.flush()
再次打开文件, 发现文件有内容了。
可以用来打印进度条 ,可以试试下面的代码。
# Author rickyimport sys,timefor i in range(20):sys.stdout.write ( "#") # 用sys模块 标准输出,写。sys.stdout.flush() # 时时刷新time.sleep(0.1) # 使用time模块。延时
truncate
截断
我们现在有这个一个文件,
[root@localhost day3]# cat yesterday2.txt
When I was young
当我小时候
I'd listen to the radio
聆听收音机
Waitng for my favorite songs
等着我最喜欢的歌曲
When they played I'd sing along
当歌曲播放时我和着它轻轻吟唱
[root@localhost day3]# cat file_op.py
#!/usr/bin/env python3f = open ("yesterday2.txt",'a')
f.truncate() # 直接使用的话,看不出效果,因为没有指定从哪里截断。[root@localhost day3]# ./file_op.py
[root@localhost day3]#
[root@localhost day3]# cat yesterday2.txt
When I was young
当我小时候
I'd listen to the radio
聆听收音机
Waitng for my favorite songs
等着我最喜欢的歌曲
When they played I'd sing along
当歌曲播放时我和着它轻轻吟唱
这边输入数字, 从哪个字段开始截断
[root@localhost day3]# cat yesterday2.txt
When I was young
当我小时候
I'd listen to the radio
聆听收音机
Waitng for my favorite songs
等着我最喜欢的歌曲
When they played I'd sing along
当歌曲播放时我和着它轻轻吟唱
[root@localhost day3]# cat file_op.py
#!/usr/bin/env python3f = open ("yesterday2.txt",'a')
f.truncate(10) #从第10个字段开始截断 [root@localhost day3]# ./file_op.py
[root@localhost day3]#
[root@localhost day3]#
[root@localhost day3]# cat yesterday2.txt
When I was[root@localhost day3]#
和seek配合,可以指定删除的范围
以下从第10个字符开始算。往后截取10个字符。 后面的截断。 其实就是保留了 20个字符
[root@localhost day3]# cat yesterday2.txt
When I was young
当我小时候
I'd listen to the radio
聆听收音机
Waitng for my favorite songs
等着我最喜欢的歌曲
When they played I'd sing along
当歌曲播放时我和着它轻轻吟唱
It made me smile
我脸上洋溢着幸福的微笑[root@localhost day3]# cat file_op.py
#!/usr/bin/env python3f = open ("yesterday2.txt",'a')
f.seek(10)
f.truncate(20)[root@localhost day3]#
[root@localhost day3]# ./file_op.py
[root@localhost day3]#
[root@localhost day3]# cat yesterday2.txt #保留了20个字符
When I was young
当[root@localhost day3]#
读写 r+
可以用于打开文件,然后追加内容。
通过以下我们可以看到。他是写在最后一行的 。可以同时读和写。
[root@localhost day3]# cat yesterday2.txt
所有我喜爱万分的歌曲
Every shalala every wo'wo
每一个shalala每一个wo‘wo
still shines
仍然光芒四射
Every shing-a-ling-a-ling
每一个shing-a-ling
that they're starting to sing
每一个他们开始唱的
so fine
都如此悦耳
Wen they get to the part
当他们唱到他
[root@localhost day3]# cat file_op.py
#!/usr/bin/env python3
f = open ("yesterday2.txt",'r+')print ( f.readline() )
print ( f.readline() )
print ( f.readline() )
f.write("=========")
print ( f.readline() )[root@localhost day3]# ./file_op.py
所有我喜爱万分的歌曲Every shalala every wo'wo每一个shalala每一个wo‘wo[root@localhost day3]# cat yesterday2.txt
所有我喜爱万分的歌曲
Every shalala every wo'wo
每一个shalala每一个wo‘wo
still shines
仍然光芒四射
Every shing-a-ling-a-ling
每一个shing-a-ling
that they're starting to sing
每一个他们开始唱的
so fine
都如此悦耳
Wen they get to the part
当他们唱到他
=========[root@localhost day3]#
写读 r+
貌似实际场景中用的不多。
他是先写再读,但是此处需注意。 他会将原有的文件先清空在重新开始写的 。然后才能读。
[root@master day3]# cat yesterday2.txt
seems the love I've known,
看起来我所知道的爱情
has always been the most destructive kind.
好像总是变成破坏性的那种
I guess that's why now I feel so old before my time.
我猜这就是为什么我感到如此苍老,比起我的真实年龄
Yesterday When I was young
往日当我还年轻时
The taste of life was sweet
生命的感受如此美好
[root@master day3]# cat file_op.py
#!/usr/bin/env python3f = open("yesterday2.txt","w+")
f.write("---------dao1-----------\n")
f.write("---------dao2-----------\n")
f.write("---------dao3-----------\n")
f.write("---------dao4-----------\n")
f.seek(0) #回到第一个字符,开始读,因为写的时候,其实已经在最后一个字符串了
print (f.readline())
print (f.readline())f.close()[root@master day3]# ./file_op.py
---------dao1--------------------dao2-----------[root@master day3]#
[root@master day3]# cat yesterday2.txt
---------dao1-----------
---------dao2-----------
---------dao3-----------
---------dao4-----------
rb 读取2进制的文件
查看一下。可以看在用2进制的方式读取文件。 前面会有b开头(binary)
linux上处理
[root@master day3]# cat yesterday2.txt
---------dao1-----------
---------dao2-----------
---------dao3-----------
---------dao4-----------
[root@master day3]# cat file_op.py
#!/usr/bin/env python3
f = open("yesterday2.txt","rb")
print (f.read())
f.close()
[root@master day3]# ./file_op.py
b'---------dao1-----------\n---------dao2-----------\n---------dao3-----------\n---------dao4-----------\n'
windows上处理
需注意,因为之前windows上面有encoding编码的。 如果直接用2进制打开会报错。
所以在windows上面需要用2进制的话,需要将encoding去掉,就可以了。
wb
2进制写。
[root@master day3]# cat file_op.py
#!/usr/bin/env python3f = open("yesterday2.txt","wb")f.write( "hello binary".encode()) #需要将字符串转换成2进制f.close()[root@master day3]# ./file_op.py
[root@master day3]# cat yesterday2.txt
hello binary[root@master day3]#
修改文件中内容
要修改文件中的内容,其实只有2中方法。
1.打开文件,加载在内存中,进行修改,在保存在磁盘中, 就像 vim 这种的。
2. 读取老文件,进行修改,然后弄到新文件。
[root@localhost day3]# cat yesterday2.txt
When I was young
当我小时候
I'd listen to the radio
聆听收音机
Waitng for my favorite songs
等着我最喜欢的歌曲
[root@localhost day3]# cat file_op.py
#!/usr/bin/env python3f = open ("yesterday2.txt",'r')
f_new = open ("yesterday2.new",'w')for line in f:if "I'd listen to the radio" in line:line = line.replace("I'd listen to the radio","I'd watch the television") # 使用字符串替换, 替换需要修改的字符串f_new.write(line)f.close()
f_new.close()[root@localhost day3]# ./file_op.py
[root@localhost day3]# ls
file_op.py yesterday2.new yesterday2.txt yesterday.txt
[root@localhost day3]# cat yesterday2.new
When I was young
当我小时候
I'd watch the television
聆听收音机
Waitng for my favorite songs
等着我最喜欢的歌曲
for循环, 可以做如下理解。就是不管是不是判断到 字符串是否有进行替换, 都会写。
for line in f:if "I'd listen to the radio" in line: line = line.replace("I'd listen to the radio","I'd watch the television") f_new.write(line)其实等于for line in f:if "I'd listen to the radio" in line:line = line.replace("I'd listen to the radio","I'd watch the television")f_new.write(line)else:f_new.write(line)
with 语句
我们常常会忘记关闭文件。 with可以帮助我们关闭文件
格式
with open( "yesterday2",'r',encoding="utf-8") as f :for line in f:print( line )
其实就是将写变量的形式 改了。 然后这个就不用为close 担心了。
f = open( "yesterday2",'r',encoding="utf-8")改with open( "yesterday2",'r',encoding="utf-8") as f :
同时 可以打开多个
with open( "yesterday2",'r',encoding="utf-8") as f , open( "yesterday3",'r',encoding="utf-8") as g :for line in f:print( line )
可以写的工整点
with open( "yesterday2",'r',encoding="utf-8") as f , \open( "yesterday3",'r',encoding="utf-8") as g :for line in f:print( line
函数 和 函数式编程
面向对象
主要方式 是 类 ---》 class
面向过程
主要方式是 过程---》 def
函数式编程
主要方式 函数 ---》 def
格式
# 函数式编程
def func1(): # 定义函数'''testing 111 ''' # 注释print ("in the func1") # 函数内容return 0 # 返回值# 面向过程 和函数式相比就少了个 返回值。过程就像没有返回值的函数
def func2():'''testing 222'''print ("in the func2")
关于return 的 总结:
1.没有返回值。 返回 none
2.返回值=0, 返回object(对象)
3.返回值>0, 返回tuple(元组)
root@localhost day3]# ./func.py
in the func1
in the func2
in the func3
None
0
(0, 'aaa', ['aaa', 'bbb'], {'aaa': 'bbb'})
[root@localhost day3]# clear
[root@localhost day3]# lsc
-bash: lsc: command not found
[root@localhost day3]# clear
[root@localhost day3]# cat func.py
#!/usr/bin/env python3def func1():'''testing 111 '''print ("in the func1")def func2():''' testing222'''print ("in the func2")return 0def func3():'''testing333'''print ('in the func3')return 0 ,('aaa'), ['aaa','bbb'],{'aaa':'bbb'}a = func1()
b = func2()
c = func3()print (a)
print (b)
print (c)[root@localhost day3]# ./func.py
in the func1
in the func2
in the func3
None
0
(0, 'aaa', ['aaa', 'bbb'], {'aaa': 'bbb'})
[root@localhost day3]#
函数赋值
位置参数
可以给函数赋值, 但是当运行函数的时候,一定要把值写进去。否则会报错
[root@localhost day3]# cat func.py
#!/usr/bin/env python3def func1(x,y): # 这里的x y 叫形参'''testing 111 '''print ( x )print ( y )return 0 func1 (1,2) # 这里的x y 叫实参,顺序于形参一一对应[root@localhost day3]# ./func.py
1
2
关键字调用
也可以这么写
[root@localhost day3]# cat func.py
#!/usr/bin/env python3def func1(x,y):'''testing 111 '''print ( x )print ( y )return 0 func1 (y=2,x=1) # 这个叫关键字调用 [root@localhost day3]# ./func.py
1
2
有可以2者混用
这边有个地方需要注意, 就是位置参数一定要写在关键字参数的前面, 否则会报错 。
[root@localhost day3]# cat func.py
#!/usr/bin/env python3def func1(x,y,z):'''testing 111 '''print ( x )print ( y )print ( z )return 0 func1 (2,z=1,y=6)[root@localhost day3]# ./func.py
2
6
1
默认参数
就是形参的时候,直接就给赋值了。
特点:
1.调用函数的时候,默认参数非必须传递。 可用于,安装时候的默认安装
[root@localhost day3]# cat func.py
#!/usr/bin/env python3def func1(x,y=2):'''testing 111 '''print ( x )print ( y )return 0 func1 (4)[root@localhost day3]# ./func.py
4
2
参数组
当实参的数量确定不了的时候。 我们可以使用参数组。 这样就不会报错 了。
可以接受N个 位置参数。转换成元组的形式。
def func1(*args):'''testing 111 '''print (args)func1(1,2,3,4,5,6)
字典形式传参
**kwagrs : 把N个关键字参数,转换成字典的方式。
[root@localhost day3]# cat func.py
#!/usr/bin/env python3
def func1(**kwargs): #固定格式 '''testing 111 '''print (kwargs)func1 ( name = 'alex', age = '11' , sex = 'f' )[root@localhost day3]# ./func.py
{'name': 'alex', 'age': '11', 'sex': 'f'}
也可以单独把 当个元素 取出来。
[root@localhost day3]# cat func.py
#!/usr/bin/env python3def func1(**kwargs):'''testing 111 '''print (kwargs)print (kwargs['name'])print (kwargs['age'])print (kwargs['sex'])func1 ( name = 'alex', age = '11' , sex = 'f' )[root@localhost day3]# ./func.py
{'name': 'alex', 'age': '11', 'sex': 'f'}
alex
11
f
也可以和 其他参数一起使用
[root@localhost day3]# cat func.py
#!/usr/bin/env python3
def func1(name,age=18,**kwargs): #和默认参数,位置参数一起使用'''testing 111 '''print (name)print (age)print (kwargs)func1 ( 'AAAA', hobby = 'hahaha' , sex = 'f' )[root@localhost day3]# ./func.py
AAAA
18
{'hobby': 'hahaha', 'sex': 'f'} #将关键字参数变成了字典的形式
函数套 函数
[root@localhost day3]# cat func.py
#!/usr/bin/env python3
def logger (source):print ("from %s" %source ) def func1(name,age=18,**kwargs):'''testing 111 '''print (name)print (age)print (kwargs)logger ("test4") # 函数套函数 func1 ( 'AAAA', hobby = 'hahaha' , sex = 'f' )[root@localhost day3]# ./func.py
AAAA
18
{'hobby': 'hahaha', 'sex': 'f'}
from test4
局部变量
就是将一个变量封在函数中, 而不影响全局变量
在子程序中定义的变量称为局部变量 。在程序的一开始定义的变量称为全局变量。
全局变量的作用域是整个程序,局部变量的作用域是定义改变量的子程序。
当全局变量和局部变量同名的时候:
在定于局部变量的子程序内,局部变量起作用,其他地方全局变量起作用。
[root@localhost day3]# cat func.py
#!/usr/bin/env python3def change_name(name):print ("before name",name)
name = "BBBB" #这函数就是这个这个变量的作用域,只在函数里面生效 print ("after name", name)name = "aaaa"
print(name)
change_name(name)
print(name)[root@localhost day3]# ./func.py
aaaa #函数外
before name aaaa #函数内
after name BBBB #函数内
aaaa #函数外
函数中定义全局变量
上面我们看到,函数中变量值能在函数中生效。 但是如果我们要强行在函数中定义全局变量,也能实现。
使用global
[root@localhost day3]# cat func.py
#!/usr/bin/env python3country = "china"def change():
global countrycountry = "USA"print (country)print (country)
change()
print( country )
[root@localhost day3]# ./func.py
china
USA
USA
但是这里我们要注意一个问题。 如果我们要在函数中定义全局变量。 则在定义之前。我们不能在函数中调用这个变量 ,否则会报错 。如下 。
在定义global之前,就使用这个变量了。
然后运行的时候回报错。
所以在函数中使用全局变量。 在定义前。不能使用。
局部变量中的,列表、字典等复杂变量可以全局生效。
[root@localhost day3]# cat func.py
#!/usr/bin/env python3name = [ 'aaa','bbb','ccc']def change_name():print ( "inside", name )name[0] = ('11111')change_name()
print (name)[root@localhost day3]# ./func.py
inside ['aaa', 'bbb', 'ccc']
['11111', 'bbb', 'ccc']
递归
就是自己调用自己
[root@localhost day3]# cat recursion.py
#!/usr/bin/env python3def calc (n):print(n)return calc(n+1) #返回的 调用自己的函数,是自己的函数+1calc(0)
[root@localhost day3]# ./recursion.py
0
1
2
调用的函数 最多只有 999层。之后就会报错了
递归的特性:
1. 必须有一个明确的结束条件
2.每次进入更深一层递归时,问题的规模比上次递归的应有所较少。
3.递归的效率不高,递归的层次过多会导致栈溢出。
以下递归是,给他一个值。并且一直除以2,并且保持整数的情况下,要大于0,才执行。
[root@localhost day3]# cat recursion.py
#!/usr/bin/env python3def calc (n):print(n)if int(n) > 0:return calc(int(n/2))
calc(10)[root@localhost day3]# ./recursion.py
10
5
2
1
0
高阶函数(此处可以和day4的 装饰器 一起看 , 有助于理解 )
函数里面可以有参数。如果一个函数里面接受另一个函数作为参数,那这种函数就是高阶函数。
1. 把一个函数名当做实参传给另一个函数
2. 返回值中包含函数名
[root@localhost day3]# cat func.py
#!/usr/bin/env python3def add (a,b,f):return f(a) + f(b)
res = add(3,-6,abs) #abs其实是内置函数(这样就是函数调函数), 是取绝对值的意思(就是都是正数)本来是(-6+3)应该等于-3. 但是都是绝对值的话就是(6+3)。那就是9,
# 此处需要注意,这边是传函数,不是传函数的执行结果,所有不能abs()这么写
print(res)[root@localhost day3]# ./func.py
9
匿名函数
就是不用定义名字的函数、使用lambda函数
[root@localhost day4]# cat decorator1.py
#!/usr/bin/env python3calc = lambda x:x*3
print ( calc (3))[root@localhost day4]# ./decorator1.py
9
转载于:https://www.cnblogs.com/rockyricky/p/10857671.html
跟着ALEX 学python day3集合 文件操作 函数和函数式编程相关推荐
- 跟着 Alex 学python 1.安装
声明 : 文档内容学习于 http://www.cnblogs.com/xiaozhiqi/ 参考文档: http://www.runoob.com/python/python-tutorial.ht ...
- Python集合文件操作Day03
集合 主要作用: 去重 关系测试, 交集\差集\并集\反向(对称)差集 集合也是一种数据类型,一个类似列表东西,它的特点是无序的,不重复的,也就是说集合中是没有重复的数据 #集合定义 list_1 = ...
- ❤️学懂C语言文件操作读这篇就够了(万字总结,附习题)❤️
目录 一,写在前面 二,为什么使用文件 1,原因 2,数据流 3,缓冲区(Buffer) 4,C语言中带缓冲区的文件处理 5,文件类型 6,文件存取方式 三,什么是文件 1,程序文件 2,数据 ...
- python 对 yaml 文件操作
python 对 yaml 文件操作 #!/usr/bin/env python # -*- encoding: utf-8 -*- """ @Introduce : p ...
- Python实现tab文件操作
Python实现tab文件操作 # -*- coding:gbk -*- import os class TABFILE: def __init__(self, filename, dest_ ...
- python怎么读取文件-python怎么读写文件操作
本节内容:I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input/ ...
- python处理excel教程实例-python 读写excel文件操作示例【附源码下载】
本文实例讲述了python 读写excel文件操作.分享给大家供大家参考,具体如下: 对excel文件的操作,python有第三方的工具包支持,xlutils,在这个工具包中包含了xlrd,xlwt等 ...
- python中对文件、文件夹(文件操作函数)的操作
python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目 ...
- Python中的文件操作和异常
Python中的文件操作和异常 文章目录 Python中的文件操作和异常 一.文件 01. 文件的概念 1.1 文件的概念和作用 1.2 文件的存储方式 文本文件和二进制文件 02. 文件的基本操作 ...
最新文章
- iOS:一句代码实现文本输入的限制
- BZOJ 2144 跳跳棋(神仙建模题,倍增 LCA,二分)【BZOJ修复工程】
- C++中的基本数据类型介绍
- 我练习项目眼中的 vue
- iOS开发之网络编程--1、NSURLSession的基本使用
- nanomsg(ZeroMQ with C)
- mysql中depart_mysql 学习笔记
- SAP CRM Reference类型下拉菜单里的值是从哪里取出的
- 【竞赛算法学习】学术前沿趋势分析-论文数据统计
- python批量操作Linux服务器脚本,ssh密码登录(执行命令、上传、下载)(一)...
- 我不藏了:7个技术体系、共100篇文章、总计1OO万字
- java test circle_java-使用Jacoco和Circle CI生成测试覆盖率失败
- SecureCRT安装及破解
- 考试酷c语言程序设计的答案大全,C语言程序设计考试试卷07级A.doc
- FLOW 3D二次开发
- 如何完整的安装Cygwin
- JavaFX源码分析和实战之音频播放:MediaPlayer和AudioClip播放音频剪辑以及AudioClip与MediaPlayer的区别
- IE浏览器设置UserAgent
- c站官网(c站官网客户端下载苹果)
- 【C++】Big Five: 构造函数、拷贝构造函数、拷贝赋值函数、移动构造函数、析构函数