一、 集合

集合是一个无序的,不重复的数据组合,主要作用如下

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 python3


list = [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 python3


list = [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 python3


list = [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 python3


list = [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 python3

list = [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 python3


list = [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 python3


list = [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 python3

list = [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 python3


list = [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 python3

data = open ("yesterday.txt").read()                   #直接打开文件  
print (data)
[root@localhost python]#

 

windows中

因为windows  默认是 GBK的编码格式, 所以在windows中打开的话。需要定义编码字符集

# Author ricky

data = 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 python3

f = open ("yesterday.txt")

data = f.read()
data2 = f.read()
print ( data )
print ( "data2==============", data2 )


[root@localhost python]# ./file_op.py 
aaaaaa
bbbbbb
ccccc

data2==============

 

 

逐行读取  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  python3


f = 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  python3


f = 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  python3


f = 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  python3

f = open("yesterday.txt")
count = 0
for i  in f :
    if count == 5:
        print ("=====================")
    print ( i.strip() )
    count += 1

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行 

[root@master day3]# cat file_op.py 
#!/usr/bin/env  python3


f = open("yesterday.txt")
count = 0

for i  in f :
    if count >= 5 and  count <= 10 :
        print ( i.strip() )
    count += 1

f.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 将文件内容,变成了列表。   所以他每次都会将整个文件进行转换。 如果是大文件。会影响性能。所以不推荐。

但是 , 因为列表有下标。 所以。在处理小文件的时候。 可能会写起来方便点。  但是不推荐。 

python为什么调用不了fenics_开发工具

 

[root@master day3]# cat file_op.py 
#!/usr/bin/env  python3


f = 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  python3


f = 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  python3


f = 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 python3

f = open ("yesterday.txt","r")

data = f.read()
data2 = f.read()

print ( data )
print ( "data2==============", data2 )
[root@localhost python]# ./file_op.py 
aaaaaa
bbbbbb
ccccc

data2==============

 

w  写文件

这边需要注意,写文件的话,w参数每次写都是覆盖。 会将原本的文件内容删除。

[root@localhost python]# cat yesterday.txt 
aaa
bbb
ccc

[root@localhost python]# cat file_op.py 
#!/usr/bin/env python3

f = 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 python3

f = 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 python3

f = open ("yesterday.txt","a")


f.write ("ppp\n")
f.write ("ooo\n")
[root@localhost python]# ./file_op.py 
[root@localhost python]# cat yesterday.txt 
123456789

ppp
ooo

 

其他的一些使用方法

tell

就是告诉你现在的文件指针位置的。 注意:它不是按行来算的,是字符串的位置来算的。

[root@master day3]# cat file_op.py 
#!/usr/bin/env  python3


f = 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  python3


f = 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上进行测试

现在有个空文件

111.txt

然后插入一条语句

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")

 再次打开,发现文件还是空的。

python为什么调用不了fenics_sed_02

 

 

 这个时候输入

 

>>> f.flush()

 

python为什么调用不了fenics_python为什么调用不了fenics_03

再次打开文件, 发现文件有内容了。

python为什么调用不了fenics_python_04

 

可以用来打印进度条 ,可以试试下面的代码。

# Author ricky

import sys,time

for  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 python3

f = 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 python3

f = 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 python3

f = 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  python3

f = 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进制打开会报错。

 

python为什么调用不了fenics_开发工具_05

 

 

 所以在windows上面需要用2进制的话,需要将encoding去掉,就可以了。

python为什么调用不了fenics_开发工具_06

 

 

 

wb

2进制写。

[root@master day3]# cat file_op.py 
#!/usr/bin/env  python3


f = 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 python3

f = 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  python3

def func1():
    '''testing 111 '''
    print ("in the func1")

def  func2():
    ''' testing222'''
    print ("in the func2")
    return 0

def 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  python3

def 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  python3

def 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  python3

def 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  python3

def 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  python3

def 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  python3


def  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  python3


country =  "china"

def  change():
     global country
     country = "USA"
     print  (country)

print (country)
change()
print( country )
[root@localhost day3]# ./func.py 
china
USA
USA

 

 

但是这里我们要注意一个问题。  如果我们要在函数中定义全局变量。   则在定义之前。我们不能在函数中调用这个变量 ,否则会报错

在定义global之前,就使用这个变量了。

python为什么调用不了fenics_开发工具_07

 

 

 然后运行的时候回报错。

python为什么调用不了fenics_开发工具_08

 

所以在函数中使用全局变量。 在定义前。不能使用。

 

 

局部变量中的,列表、字典等复杂变量可以全局生效。

[root@localhost day3]# cat func.py 
#!/usr/bin/env  python3


name  = [ '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  python3



def calc (n):
    print(n)
    return calc(n+1)                                #返回的 调用自己的函数,是自己的函数+1

calc(0)
[root@localhost day3]# ./recursion.py  
0
1
2

 

调用的函数 最多只有 999层。之后就会报错了

python为什么调用不了fenics_python_09

 

递归的特性:

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

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

3.递归的效率不高,递归的层次过多会导致栈溢出。

 

以下递归是,给他一个值。并且一直除以2,并且保持整数的情况下,要大于0,才执行。

[root@localhost day3]# cat recursion.py 
#!/usr/bin/env  python3


def 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  python3


def 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  python3

calc = lambda x:x*3
print  ( calc (3))


[root@localhost day4]# ./decorator1.py 
9