Python基础(二)

内置函数

  如何查看Python内置函数?

  方式一:官方文档查看

 

  方式二:所有内置函数:dir(__builtin__)

      查看某个内置函数的用法:help(函数名),比如:help(str)

      查看某个函数的位置:random.__file__     

 random.__file__
 'd:\\pytho3.6\\lib\\random.py'

文件IO操作

1.打印到屏幕  print

2.读取键盘输入 input

3.打开和关闭文件

  打开文件:open 函数
"你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。"
语法:
file object = open(file_name [, access_mode][, buffering])
各个参数的细节如下:
file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
不同模式打开文件的完全列表:
模式  描述
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

以下是和file对象相关的所有属性的列表:
属性 描述
file.closed 返回true如果文件已被关闭,否则返回false。
file.mode 返回被打开文件的访问模式。
file.name 返回文件的名称。
"""
  关闭文件: close()方法
File 对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。
当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。
语法:
fileObject.close()

  4.读写文件 

4.1 write()方法
    write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
    write()方法不会在字符串的结尾添加换行符('\n'):
    语法:
    fileObject.write(string)
    在这里,被传递的参数是要写入到已打开文件的内容。
    例子:
    f = open(file,'w',encoding='utf-8')
    f.write('ip_type,ip,port,speed,position,live_time,update_time\n') 
    # 关闭打开的文件
    fo.close()
4.2 read()方法:
        "从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。"
        语法:
        fileObject.read([count])
        在这里,被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾。
        # 打开一个文件
        fo = open("foo.txt", "r+")
        str = fo.read(10)
        print("读取的字符串是 : ", str)
        # 关闭打开的文件
        fo.close()
        以上实例输出结果:
读取的字符串是 :  www.runoob
4.3 readline()方法:一次读取一行
4.4 readlines()方法:读取所有内容,以列表形式返回,每一行作为列表中的一个元素。
4.5 文件位置: 文件定位 tell()方法告诉你文件内的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后。 seek(offset [,from])方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。 如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。
 
 
Python的os模块给我们提供执行文件处理操作的方法
5.删除文件
remove()方法
你可以用remove()方法删除文件,需要提供要删除的文件名作为参数。
语法:
os.remove(file_name)
例子:
下例将删除一个已经存在的文件test2.txt。
import os
# 删除一个已经存在的文件test2.txt
os.remove("test2.txt")
6.文件重命名
rename()方法需要两个参数,当前的文件名和新文件名。
语法:
os.rename(current_file_name, new_file_name)
例子:
下例将重命名一个已经存在的文件test1.txt。
import os
# 重命名文件test1.txt到test2.txt。
os.rename( "test1.txt", "test2.txt" )

 7.创建和删除文件夹

  创建文件夹

mkdir()方法
可以使用os模块的mkdir()方法在当前目录下创建新的目录们。你需要提供一个包含了要创建的目录名称的参数。
语法:
os.mkdir("newdir")
例子:
下例将在当前目录下创建一个新目录test。
import os
# 创建目录test
os.mkdir("test")

  删除文件夹

r、mdir()方法
rmdir()方法删除目录,目录名称以参数传递。
在删除这个目录之前,它的所有内容应该先被清除。
语法:
os.rmdir('dirname')
例子:
以下是删除" /tmp/test"目录的例子。目录的完全合规的名称必须被给出,否则会在当前目录下搜索该目录。
import os
# 删除”/tmp/test”目录
os.rmdir( "/tmp/test"  )

8.获取和切换目录

获取当前目录
getcwd()方法: getcwd()方法显示当前的工作目录。 语法: os.getcwd()

切换指定目录
chdir()方法
可以用chdir()方法来改变当前的目录。chdir()方法需要的一个参数是你想设成当前目录的目录名称。
语法:
os.chdir("newdir")

9.获取当前目录下的所有文件列表

获取当前目录下所有文件列表
os.listdir()
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

自定义函数

一、为什么要有函数

 1 while True:
 2     if cpu利用率 > 90%:
 3         #发送邮件提醒
 4         连接邮箱服务器
 5         发送邮件
 6         关闭连接
 7   
 8     if 硬盘使用空间 > 90%:
 9         #发送邮件提醒
10         连接邮箱服务器
11         发送邮件
12         关闭连接
13   
14     if 内存占用 > 80%:
15         #发送邮件提醒
16         连接邮箱服务器
17         发送邮件
18         关闭连接

 

我们发现,if下面的相同的内容被被多次调用,代码很冗余,于是,我们可以这样写

 1 def 发送邮件(内容)
 2     #发送邮件提醒
 3     连接邮箱服务器
 4     发送邮件
 5     关闭连接
 6   
 7 while True:
 8   
 9     if cpu利用率 > 90%:
10         发送邮件('CPU报警')
11   
12     if 硬盘使用空间 > 90%:
13         发送邮件('硬盘报警')
14   
15     if 内存占用 > 80%:

上述的两种实现方式,第二次必然比第一次的重用性和可读性要好,其实这就是函数式编程和面向过程编程的区别:

 

 

  • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
  • 面向对象:对函数进行分类和封装,让开发“更快更好更强...”

函数式编程最重要的是增强代码的重用性和可读性

二、函数的定义和调用 

函数定义  def 函数名(参数):
            函数体
       return 返回值 函数调用 函数名()

函数的定义主要有如下要点:

def:表示函数的关键字
  函数名:函数的名称,日后根据函数名调用函数
  函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
  参数:为函数体提供数据
  返回值:当函数执行完毕后,可以给调用者返回数据。

  以上要点中,比较重要有参数和返回值:

  1.返回值:函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。     

def 发送短信():
    发送短信的代码...
 
    if 发送成功:
        return True
    else:
        return False
  
while True:  
    # 每次执行发送短信函数,都会将返回值自动赋值给result
    # 之后,可以根据result来写日志,或重发等操作
 
    result = 发送短信()
    if result == False:
        记录日志,短信发送失败...

2.参数

  ·为什么要有参数?

def CPU报警邮件()
    #发送邮件提醒
    连接邮箱服务器
    发送邮件
    关闭连接

def 硬盘报警邮件()
    #发送邮件提醒
    连接邮箱服务器
    发送邮件
    关闭连接

def 内存报警邮件()
    #发送邮件提醒
    连接邮箱服务器
    发送邮件
    关闭连接
 
while True:
 
    if cpu利用率 > 90%:
        CPU报警邮件()
 
    if 硬盘使用空间 > 90%:
        硬盘报警邮件()
 
    if 内存占用 > 80%:
        内存报警邮件()

上例,无参数实现
上例,无参数实现
def 发送邮件(邮件内容)

    #发送邮件提醒
    连接邮箱服务器
    发送邮件
    关闭连接

 
while True:
 
    if cpu利用率 > 90%:
        发送邮件("CPU报警了。")
 
    if 硬盘使用空间 > 90%:
        发送邮件("硬盘报警了。")
 
    if 内存占用 > 80%:
        发送邮件("内存报警了。")

上列,有参数实现
上例,有参数实现

函数的有三中不同的参数:

  • 普通参数
  • 默认参数
  • 动态参数
def sum_2_nums(a,b):
    #a = 10
    #b = 20
    result = a+b
    print("%d + %d = %d"%(a,b,result))

num1 = int(input("请输入第一个数字:"))
num2 = int(input("请输入第二个数字:"))

#调用函数
sum_2_nums(num1,num2)
普通参数
def test(a,d,b=22,c=33):
    result = a+b+c
    print(a)
    print(b)
    print(c)
    print(d)
    print("result=%d"%result)
    
test(11,22,b=12)
test(33,33)
test(d=44,a=11,c=44)
缺省参数
def sum_2_nums(a,b,c=33,*args,**kwargs):
    print("-"*30)
    print(a)
    print(b)
    print(c)
    print(args)
    print(kwargs)
    #result = a+b+args
    #print("result=%d"%result)

sum_2_nums(11,22,33,44,55,66,77,task=99,done=89)
#sum_2_nums(11)#错误,因为形参中至少要2个实参
不定长参数
def test(a,b,c=33,*args,**kwargs):
    print("-"*30)
    print(a)
    print(b)
    print(c)
    print(args)
    print(kwargs)
    #result = a+b+args
    #print("result=%d"%result)

#test(11,22,33,44,55,66,77,task=99,done=89)
A=(44,55,66)
B={"name":"laowang","age":18}
test(11,22,33,*A,**B)
#sum_2_nums(11)#错误,因为形参中至少要2个实参
拆包、元组和字典
def test_kwargs(actions=None, **kwargs):
    print('actions:', actions)
    print('kwargs:', kwargs)


def test_args(actions=None, *args):
    print('actions:', actions)
    print('args:', args)


test_args([1,2,3])
# actions: [1, 2, 3]
# args: ()

test_args(1,2,3)
# actions: 1
# args: (2, 3)

test_args(*[1, 2, 3])
# actions: 1
# args: (2, 3)

test_kwargs({'get':'list', 'post': 'create'})
# actions: {'get': 'list', 'post': 'create'}
# kwargs: {}

test_kwargs(get='list', post='create')
# actions: None
# kwargs: {'get': 'list', 'post': 'create'}

test_kwargs(**{'get':'list', 'post': 'create'})
# actions: None
# kwargs: {'get': 'list', 'post': 'create'}
args和kwargs

实例:打印佛祖

def print_fuzu():
    print("                           _ooOoo_  ")
    print("                          o8888888o  ")
    print("                          88  .  88  ")
    print("                          (| -_- |)  ")
    print("                           O\\ = /O  ")
    print("                       ____/`---'\\____  ")
    print("                     .   ' \\| |// `.  ")
    print("                      / \\||| : |||// \\  ")
    print("                    / _||||| -:- |||||- \\  ")
    print("                      | | \\\\\\ - /// | |  ")
    print("                    | \\_| ''\\---/'' | |  ")
    print("                     \\ .-\\__ `-` ___/-. /  ")
    print("                  ___`. .' /--.--\\ `. . __  ")
    print("               ."" '< `.___\\_<|>_/___.' >'"".  ")
    print("              | | : `- \\`.;`\\ _ /`;.`/ - ` : | |  ")
    print("                \\ \\ `-. \\_ __\\ /__ _/ .-` / /  ")
    print("        ======`-.____`-.___\\_____/___.-`____.-'======  ")
    print("                           `=---='  ")
    print("  ")
    print("        .............................................  ")
    print("                 佛祖镇楼                  BUG辟易  ")
    print("         佛曰:  ")
    print("                 写字楼里写字间,写字间里程序员;  ")
    print("                 程序人员写程序,又拿程序换酒钱。  ")
    print("                 酒醒只在网上坐,酒醉还来网下眠;  ")
    print("                 酒醉酒醒日复日,网上网下年复年。  ")
    print("                 但愿老死电脑间,不愿鞠躬老板前;  ")
    print("                 奔驰宝马贵者趣,公交自行程序员。  ")
    print("                 别人笑我忒疯癫,我笑自己命太贱;  ")
    print("                 不见满街漂亮妹,哪个归得程序员?")

print_fuzu()
打印佛祖

扩展:发送邮件实例

 1         import smtplib
 2         from email.mime.text import MIMEText
 3         from email.utils import formataddr
 4          
 5          
 6         msg = MIMEText('邮件内容', 'plain', 'utf-8')
 7         msg['From'] = formataddr(["张亚飞",'1271570224@qq.com'])
 8         msg['To'] = formataddr(["走人",'2464392538@qq.com'])
 9         msg['Subject'] = "主题"
10          
11         server = smtplib.SMTP_SSL("smtp.qq.com", 465)
12         server.login("1271570224@qq.com", "euvtrglugggubagj")
13         server.sendmail('1271570224@qq.com', ['2464392538@qq.com',], msg.as_string())
14         server.quit()

lambda表达式

  匿名函数:lambda 参数:式子

  作用:书写比较简单,不需要声明函数的名称,当功能为一些比较简单的加加减减时,用lambda匿名函数,否则用def

  注:匿名函数默认带有返回值

  实例:对字母排序

s = 'string'
s = "".join((lambda x: (x.sort(), x)[1])(list(s)))
s
Out[4]: 'ginrst'

  应用:列表元素为字典时按照字典的value值排序,list.sort(key x:x['age'])

实例:
def test(a,b,func):
    result = func(a,b)
    print(result)

test(11,22,lambda x,y:x+y)
匿名函数

lambda存在意义就是对简单函数的简洁表示

Python高级函数

1.map

  求一个序列或者多个序列进行函数映射(遍历)之后的值,就该想到map这个函数,它是python自带的函数,在python3.*之后返回的是迭代器,同filter,需要进行列表转换.

 

 

调用: map(function,iterable1,iterable2),function中的参数值不一定是一个x,也可以是x和y,甚至多个;后面的iterable表示需要参与function运算中的参数值,有几个参数值
就传入几个iterable map函数的原型是map(function, iterable, …),它的返回结果是一个列表。
  参数function传的是一个函数名,可以是python内置的,也可以是自定义的。   参数iterable传的是一个可以迭代的对象,例如列表,元组,字符串这样的。 这个函数的意思就是将function应用于iterable的每一个元素,结果以列表的形式返回。注意到没有,iterable后面还有省略号,意思就是可以传很多个iterable,如果有额外的 iterable参数,并行的从这些参数中取元素,并调用function。如果一个iterable参数比另外的iterable参数要短,将以None扩展该参数元素。 map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
# 1.map自定义函数
def f(x):
    return x*x
a = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
list(a)
# 2.map复杂函数
list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
== [str(x) for x in [1,2,3,4,5,6,7,8,9]]
# 3.实例
def add(x,y,z):
    return x,y,z

list1 = [1,2,3]
list2 = [1,2,3,4]
list3 = [1,2,3,4,5]
list4 = [1,2,3,4,5,6]
res = map(add, list1, list2, list3)
list(res)

def add(x,y,z):
    return x+y+z
list1=[1,2,3]
list2=[1,2,3]
list3=[1,2,3]
list(map(add,list1,list2,list3))

func = lambda x,y,z:x+y+z
func(list1,list2,list3)

def format_name(s):
return s.capitalize()
list(map(lambda x:x.capitalize(), ['adam', 'LISA', 'barT']))

foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]

list(map(lambda x: x * 2 + 10, foo))
print ([x * 2 + 10 for x in foo]) 
map实例

2.filter

  filter的功能是过滤掉序列中不符合函数条件的元素,当序列中要删减的元素可以用某些函数描述时,就应该想起filter函数。

调用: filter(function,sequence),function可以是匿名函数或者自定义函数,它会对后面的sequence序列的每个元素判定是否符合函数条件,返回TRUE或者FALSE,从而只留下TRUE
    的元素;sequence可以是列表、元组或者字符串 Python内建的filter()函数用于过滤序列。和map()类似,filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True
还是False决定保留还是丢弃该元素。
例1,在一个list中,删掉偶数,只保留奇数,可以这么写:
def is_old(x):
    return x%2 == 0
list(filter(is_old,[1,2,3,4,5,6,7,8,9,10]))
print([x for x in foo if x%3==0])

例2:在一个list中,只保留能被三整除的数字
list(filter(lambda x: x % 3 == 0, foo)))
print ([x for x in foo if x % 3 == 0])
filter实例

3.reduce 

对一个序列进行压缩运算,得到一个值。但是reduce在python2的时候是内置函数,到了python3移到了functools模块,所以使用之前需要 from functools import reduce 

 

调用: reduce(function,iterable),其中function必须传入两个参数,iterable可以是列表或者元组 
reduce() 函数会对参数序列中元素进行累积。
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数
function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数
据用 function 函数运算,最后得到一个结果。
reduce(function, iterable[, initializer])
function -- 函数,有两个参数
iterable -- 可迭代对象
initializer -- 可选,初始参数
from functools import reduce 
print (reduce(lambda x, y: x + y, foo))

def char2num(s):
    return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]

def str2int(s):
    return reduce(lambda x,y: x*10+y, map(char2num, s))
print(str2int('12345'))

def kfactorial(k):
    """求k的阶乘"""
    if k == 0 or k == 1:
        return 1
    from functools import reduce
    return reduce(lambda x,y:x*y,list(range(1,k+1)))

def kfactorial2(k):
    a = 1
    for i in range(1,k+1):
        a *= i
    return a

def kfactorial3(k):
    if k == 0 or k == 1:
        return 1
    else:
        return kfactorial3(k-1)
    
    
kfactorial(5)
kfactorial2(6)
kfactorial3(7)
reduce实例

闭包

  定义:在函数内部再定义⼀个函数, 并且这个函数⽤到了外边函数的变量, 那么将这个函数成为闭包 

例1

def test(number):
	print("-----1------")
	#在函数内部再定义⼀个函数, 并且这个函数⽤到了外边函数的变量, 那么将这个函数成为闭包
	def test_in(number2):
		print("-----2-----")
		print(number+number2)

	print("---3---")
	#其实这⾥返回的就是闭包的结果
	return test_in
#给test函数赋值, 这个100就是给参数number
ret = test(100)
print("-"*30)
#注意这⾥的1其实给参数number2
ret(1)
ret(100)
ret(200)
def test(a,b):
    def test_in(x):
        print(a*x+b)

    return test_in

line1 =test(1,1)
line1(0)
line2 = test(10,4)
line2(0)

line1(0)
闭包案例
"""闭包中修改外部函数变量应声明nonlocal"""


def test():
    x = 10

    def test_in():
        nonlocal x
        x += 1
        print(x)
    return test_in


c = test()
c()
# 不声明nonlocal   UnboundLocalError: local variable 'x' referenced before assignment
# 声明之后 11
闭包中修改外部函数变量应声明nonlocal

装饰器

  装饰器是函数,只不过该函数可以具有特殊的含义,装饰器用来装饰函数或类,使用装饰器可以在函数执行前和执行后添加相应操作。换句话说,Decorator 通过返回包装对象实现间接调用,以此插入额外逻辑。应该算是言简意赅了

def w1(func):
    def inner():
        print("---正在验证权限---")
        if True:
            func()
        else:
            print("没有权限")
    return inner
@w1
def f1():
    print("---f1---")
@w1
def f2():
    print("---f2---")

#innerFunc = w1(f1)
#innerFunc()
#f1 = w1(f1)
f1()
f2()
普通装饰器
#定义函数: 完成包裹数据
def makeBold(fn):
    def wrapped():
        print("-----1-----")
        return "<b>" + fn() + "</b>"
    return wrapped

#定义函数: 完成包裹数据
def makeItalic(fn):
    def wrapped():
        print("-------2-----")
        return "<i>" + fn() + "</i>"
    return wrapped

@makeBold
@makeItalic
def test3():
    print("-------3------")
    return "hello world-3"


print(test3())
多个装饰器
def w1(func):
    print("----正在装饰1----")
    def wrpped():
        print("----正在验证权限1------")
        return func()
    return wrpped

def w2(func):
    print("----正在装饰2----")
    def wrpped():
        print("----正在验证权限2------")
        return func()
    return wrpped

#只要python解释器执行到了这个代码,那么就会自动的进行装饰,而不是等到调用的时候才装饰的
@w1 #f1 = w1(w2(f1()))
@w2 #f1 = w2(f1())
def f1():
    print("-----f1-----")



#在调用f1之前,已经进行装饰了
f1()
什么时候执行
def func(functionName):
    print("-----func---1----")
    def func_in():
        print("----func_in---1--")
        functionName()
        print("---func_in---2---")

    print("----func---2---")
    return func_in

@func
def test():
    print("---test---")

#test = func(test)

test()
装饰器对无参数的函数装饰
def func(functionName):
    print("-----func---1----")
    def func_in(a,b):
        print("----func_in---1--")
        functionName(a,b)
        print("---func_in---2---")

    print("----func---2---")
    return func_in
@func
def test(a,b):
    print("---test- a=%d,b=%d---"%(a,b))

#test = func(test)

test(11,22)
有参数
def func(functionName):
    print("-----func---1----")
    def func_in(*args,**kwargs):
        print("----func_in---1--")
        functionName(*args,**kwargs)
        print("---func_in---2---")

    print("----func---2---")
    return func_in

@func
def test(a,b,c):
    print("---test- a=%d,b=%d,c=%d---"%(a,b,c))
@func
def test1(a,b,c,d):
    print("---test- a=%d,b=%d,c=%d,d=%d---"%(a,b,c,d))

#test = func(test)
不定长参数
def func(functionName):
    print("-----func---1----")
    def func_in():
        print("----func_in---1--")
        return functionName()
        print("---func_in---2---")

    print("----func---2---")
    return func_in
@func
def test():
    print("---test----")
    return "haha"

ret = test()
print("test return value is %s"%ret)
有返回值
def func(functionName):
    def func_in(*args,**kwargs):
        print("---记录日志------")
        ret = functionName(*args,**kwargs)
        return ret
    return func_in
@func
def test():
    print("---test----")
    return "haha"

@func
def test2():
    print("----test2---")

@func
def test3(a):
    print("----test3--a=%d--"%a)

ret = test()
print("test return value is %s"%ret)

a = test2()
print("test2 return value is %s"%a)

test3(11)
通用装饰器
def func_arg(arg):
    def func(functionName):
        def func_in():
            print("---记录日志--arg=%s----"%arg)
            if arg=="heihei":
                functionName()
                functionName()
            else:
                functionName()
        return func_in
    return func

#1.先执行func_arg("heihei")函数,这个函数return 的结果是func这个函数的引用
#2.@func
#3使用@func对test进行装饰
@func_arg("heihei")
def test():
    print("---test----")

@func_arg("haha")
def test2():
    print("-----test2------")

test()
test2()
带有参数的装饰器
class Eat(object):
    # 装饰器 Eta
    # :return
    def __init__(self,func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print('i am eating')
        return self.func(*args,**kwargs)


@Eat
def wash():
    # 洗手
    # :return:
    print('i am washing')


wash()
print(wash.__class__)

#
# class Eat(object):
#     """
#     装饰器 Eta
#     :return
#     """
#     def __call__(self, func):
#         @wraps(func)
#         def eat(*args,**kwargs):
#             print('i am eating')
#             return func(*args,**kwargs)
#         return eat
#
#
# @Eat()
# def wash():
#     """
#     洗手
#     :return:
#     """
#     print('i am washing')
#
#
# wash()
# print(wash.__name__)
类装饰器
from functools import wraps
def decorator_name(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        if not can_run:
            return "Function will not run"
        return f(*args, **kwargs)
    return decorated
 
@decorator_name
def func():
    return("Function is running")
 
can_run = True
print(func())
# Output: Function is running
 
can_run = False
print(func())
# Output: Function will not run
保留原对象指定属性信息
from functools import wraps


def auth(func):
    @wraps(func)   # 伪装的更彻底
    def inner(*args,**kwargs):
        print('')
        ret = func(*args,**kwargs)
        print('')
        return ret
    return inner


@auth
def index():
    print('index')


@auth
def detail():
    print('index')


print(index.__name__)
print(detail.__name__)
装饰器通用写法
import time                                                        
import functools                                                   
                                                                   
                                                                   
def timeit(fun):                                                   
    @functools.wraps(fun)                                          
    def wrapper(*args, **kwargs):                                  
        start_time = time.time()                                                                           
        res = fun(*args, **kwargs)                                 
        end_time = time.time()                                     
        print('运行时间为%.6f' % (end_time - start_time))               
        return res                                                 
                                                                   
    return wrapper                                                 
                                                                   
                                                                   
@timeit                    #time1 = timeit(time)                   
def time1(n):                                                      
    return [i * 2 for i in range(n)]                               
                                                                   
                                                                   
print(time1(20))                                                   
自定义timeit装饰器

递归

利用函数编写如下数列:

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368

def func(arg1,arg2):
    if arg1 == 0:
        print(arg1, arg2)
    arg3 = arg1 + arg2
    print(arg3)
    func(arg2, arg3)

func(0,1)

可变、不可变类型 

  可变类型:字典,列表

  不可变类型:数字,字符串,元组,集合

  注:字典中的key值可以位数字,字母,元组,但不可为列表,不符合哈希函数规则

案例

#用来存储名片(列表)
card_infors = []

def print_menu():
    """完成打印功能菜单"""
    print("="*50)
    print(" 名片管理系统 v0.1")
    print(" 1.添加一个名片")
    print(" 2.删除一个名片")
    print(" 3.修改一个名片")
    print(" 4.查询一个名片")
    print(" 5.显示所有名片")
    print(" 6.保存信息")
    print(" 7.退出系统")
    print("="*50)

def add_new_card_infor():
    """完成添加一个新的名片"""
    new_name = input("请输入新的名字:")
    new_qq = input("请输入新的qq:")
    new_weixin = input("请输入新的微信:")
    new_addr = input("请输入新的住址:")

    #定义一个新的字典,用来存储一个新的名片
    new_infor ={}
    new_infor['name'] = new_name
    new_infor['qq'] = new_qq
    new_infor['weixin'] = new_weixin
    new_infor['addr'] = new_addr

    #将一个字典添加到列表中
    global card_infors
    card_infors.append(new_infor)

    print(card_infors)
def del_card_infor():
    """用来查询一个名片"""
    global card_infors
    find_flag=0
    del_name = input("删除的姓名是:")
    for temp in card_infors:
        if del_name == temp['name']:
            card_infors.remove(temp)
            find_flag = 1
            print(card_infors)
            break
    #判断是否找到了
    if find_flag==0:
        print("查无此人")

def show_all_infor():
    """显示所有的名片信息"""
    global card_infors
    print("姓名\tQQ\t微信\t住址")
    for temp in card_infors:
            print("%s\t%s\t%s\t%s\t"%(temp['name'],temp['qq'],temp['weixin'],temp['addr']))
def chang_card_infor():
    """完成对名片信息的修改"""
    global card_infors

    find_flag=0
    name = input("你要修改的名片的姓名是:")
    for temp in card_infors:
        if name==temp['name']:
            temp['name'] = input("姓名:")
            temp['qq'] = input("qq:")
            temp['weixin'] = input("微信:")
            temp['addr'] = input("地址:")
            print("姓名\tQQ\t微信\t住址")
            print("%s\t%s\t%s\t%s\t"%(temp['name'],temp['qq'],temp['weixin'],temp['addr']))
            find_flag=1
            break
    if find_flag==0:
        print("查无此人")
def find_card_infor():
    """查找名片上的信息"""
    global card_infors
    find_name = input("请输入要查找的名字:")
    find_flag = 0 #默认表示没有找到
    for temp in card_infors:
        if find_name == temp['name']:
            print("%s\t%s\t%s\t%s\t"%(temp['name'],temp['qq'],temp['weixin'],temp['addr']))
            find_flag = 1
            break   
    #else:
        #print("查无此人")
              #p判断是否找到了
    if find_flag==0:
        print("查无此人")


def save_2_file():
    """把已经添加的信息保存到文件中"""
    #f = open("backup.data","w")
    f = open("backup.data", "w")
    #f.write(str(card_infors)
    f.write(str(card_infors))
    f.close()

def load_infor():
    global card_infors
    try:
        f = open("backup.data","r")
        card_infors = eval(f.read())
        f.close()
    except Exception:
        pass

def main():    
    """完成对整个程序的控制"""

    #恢复(加载)之前的数据到程序中
    load_infor()
    #1. 打印功能提示
    print_menu()
    while True:        
        #2.获取用户的输入
        num = int(input("请输入操作序列:"))
        #3.根据用户的输入执行相应的功能
        if num==1:
            add_new_card_infor()

        elif num==2:
            del_card_infor()

        elif num==3:
            chang_card_infor()

        elif num==4:
            find_card_infor()

        elif num==5:
            show_all_infor()

        elif num==6:
            save_2_file()

        elif num==7:
            break
        else:
            print("你输入的信息有误,请重新输入!")

if __name__=="__main__":
    main()
名片管理系统文件版

 

转载于:https://www.cnblogs.com/zhangyafei/articles/10111720.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值