zoukankan      html  css  js  c++  java
  • Python系列之lambda、函数、序列化

    lambda

    在python中使用lambda来创建匿名函数,而用def创建的方法是有名称的,除了从表面上的方法名不一样外,python lambda还有哪些和def不一样呢?

    1. 1 python lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而def则会把函数对象赋值给一个变量。
    2. 2 python lambda它只是一个表达式,而def则是一个语句。

    下面是python lambda的格式,看起来好精简:

    lambda x: print(x)
    

    下面举几个例子:

    def su(func):
        return func +2
    for x in range(10):
        ret = su(x)
    #------------------------------------# 两个例子输出的结果是一样的[2,3,4,5,6,7,8,9,10,11]
    g = lambda x:x+2
    info = [g(x) for x in range(10)]
    
    

    可以看出lambda确实很简单!

    函数

    曾多次提到函数,函数到底是什么东东,那我们就一探究竟。首先先说下 为什么要用函数?

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率。

    定义函数:

    • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()
    • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
    • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
    • 函数内容以冒号起始,并且缩进。
    • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

    语法:

    def functionname( parameters ):
       function_suite
       return [expression]
    

    返回值

    def foo(func):
        return func + 1    #return,表示函数的返回值
    

    python 函数返回值有两种形式:

    1. 返回一个值。
    2. 返回多个值

    默认返回None。

    参数

    • 必备参数 : 必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样
    • 关键字参数:  关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
    • 默认参数  :调用函数时,缺省参数的值如果没有传入,则被认为是默认值。
    • 不定长参数: 函数能处理比当初声明时更多的参数
    #必备参数
    def foo(func):
        print(func)
    foo('hello')  #hello
    #关键字参数
    def foo(func):
        print(func)
    foo(func = 'hello') #hello
    
    #缺省参数
    
    def printinfo( name, age = 35 ):
       print("Name: ", name)
       print("Age ", age)
       
    printinfo( age=50, name="miki" )  #Name: miki,Age 50
    printinfo( name="miki" ) #Name: miki,Age  35
    
    #不定长参数
    def functionname(*args,**kwargs):
        print('输出:%s'%args)
    
    functionname(['ok',11,22,33]) #输出:['ok', 11, 22, 33]
    

     序列化之pickle和json

    pickle 和json 是序列化的两个模块。

    Json模块提供了四个功能:dumps、dump、loads、load

    pickle模块提供了四个功能:dumps、dump、loads、load

    pickle

    首先,我们尝试把一个对象序列化并写入文件:

    accounts = {
        'k1':'hello',
        'k2':'world'
    }
    f = open('dump.txt','wb')
    f.write(pickle.dumps(accounts))
    f.close()
    

    pickle.dumps()把任意对象序列化成一个str,然后,就可以把这个str写入文件.或者用另一个方法pickle.dump()直接把对象序列化后写入一个文件:

    f = open('dump.txt','wb')
    pickle.dump(accounts,f)
    f.close()
    

    看看写入的dump.txt文件,一堆乱七八糟的内容,这些都是Python保存的对象内部信息。

    当然有序列化也有反序列化,我们把dump.txt的一堆乱码给还原:

    f = open('dump.txt','rb')
    ret = pickle.loads(f.read())
    f.close()
    

    当然我们也可以直接用pickle.load()方法从dump.txt中直接反序列化出对象:

    f = open('dump.txt','rb')
    pickle.load(f)
    f.close()
    

    内容又变回来了。

    ps:是python独有的序列化方式,比json功能强大任何类型的数据都可以被序列化和反序列化。

     json

    如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。

    accounts = {
        'k1':'hello',
        'k2':'world'
    }
    
    f = open('dump.txt','w')
    f.write(json.dumps(accounts))
    f.close()
    

    打开dump.txt 文件内容不在是乱码,并且是可读的

    {"k1": "hello", "k2": "world"}
    

    由此可见dumps()方法返回一个str。内容就是标准的JSON。类似的,dump()方法可以直接把JSON写入一个file-like Object

    f = open('dump.txt','w')
    json.dump(accounts,f)
    f.close()
    

     要把JSON反序列化为Python对象,用loads()或者对应的load()方法,前者把JSON的字符串反序列化,后者从file-like Object中读取字符串并反序列化:

    f = open('dump.txt','r')
    c = json.loads(f.read())
    f.close()
    

    有一点需要注意,就是反序列化得到的所有字符串对象默认都是unicode而不是str。由于JSON标准规定JSON编码是UTF-8,所以我们总是能正确地在Python的strunicode与JSON的字符串之间转换。  

    import smtplib
    from email.mime.text import MIMEText
    from email.utils import formataddr
      
      
    msg = MIMEText('邮件内容', 'plain', 'utf-8')
    msg['From'] = formataddr(["武沛齐",'wptawy@126.com'])
    msg['To'] = formataddr(["走人",'424662508@qq.com'])
    msg['Subject'] = "主题"
      
    server = smtplib.SMTP("smtp.126.com", 25)
    server.login("wptawy@126.com", "邮箱密码")
    server.sendmail('wptawy@126.com', ['424662508@qq.com',], msg.as_string())
    server.quit()
    发邮件实例
  • 相关阅读:
    linux查看端口号监听状态
    linux / centos 安装SQL Server 2017 设置默认语言与排序规则Chinese_PRC_CI_AS
    centos 生产环境部署 asp.net core
    shell参数处理模板
    搜狗语料库数据整编
    Call From master/192.168.128.135 to master:8485 failed on connection exception: java.net.ConnectException: Connection refused
    spark-shell启动报错:Yarn application has already ended! It might have been killed or unable to launch application master
    webmagic爬取博客园所有文章
    jdbc链接hive报错:java.lang.ClassNotFoundException: org.apache.thrift.transport.TTransport
    NotePad++ 正则表达式替换 高级用法 [转]
  • 原文地址:https://www.cnblogs.com/yyyg/p/5508883.html
Copyright © 2011-2022 走看看