Python学习日记(四)

五、函数和模块

Python中,定义一个函数使用def保留字,语法形式如下:

def <函数名>(<参数列表>):
	[return <返回值列表>]

如果函数的 return 语句直接返回多个值,是把它们封装为元组

if __name__ == '__main__':下面的按顺序执行:

def print_1():
    print("1")
def main():
    print("2")
    print_1()
if __name__ == '__main__':
    print_1()
    main()

1.函数的参数以及默认值参数:

  • 位置参数,数量对应,位置也要对应
  • 默认值参数必须出现在函数参数列表的最右端,任何一个默认值参数右边不能有非默认值
def printinfo(name,age = 11):
    print("姓名",name)
    age = age - 1
    print("年龄",age)

printinfo("张三")
printinfo("李四",21)

在这里插入图片描述
2.可变参数:

def value(a,b,*c):
    if b == "-":
        for i in c:
            a = a - i
    elif b == "+":
        for i in c:
            a = a + i
    return a

print(value(20,"-",4,5,6))
print(value(20,"+",4,5,6))

在这里插入图片描述

3.关键字参数
**parameter接受关键参数并存放到字典中

def person(name ,age, **kw):
    print('name:',name,' age:',age,'other:',kw)
#传入任意的其他参数,满足注册的需求
person('Bob',35,city= 'NanNing' )
person('Peter',45, gender= 'M',job='Engineer')
#封装为字典,再传入参数
extra = {'city':'NanNing','job':'Engineer'}
person('Jack',24, **extra)

在这里插入图片描述
4.命名关键字

  • 如果希望确定关键字参数的名字,则需要命名关键字参数
  • 用特殊符合.分隔,“后面的视为命名关键字参数
def person(name ,age, *,city,job):
    print('name:',name,' age:',age,'city:',city,'job:',job)
person('Peter',45, city= 'guilin',job='Engineer')

在这里插入图片描述
5.传参机制

def swap(a,b):
    a,b = b,a
    print("swap函数里面a,b的值分别是",a,b)

a,b = 3,4
swap(a,b)
print("swap函数里面a,b的值分别是",a,b)

在这里插入图片描述
在这里插入图片描述
正确的操作应该是:

def swap(mydict):
    mydict['a'],mydict['b'] = mydict['b'],mydict['a']
    print("swap函数里面a,b的值分别是",mydict['a'],mydict['b'])

mydict = {'a':3,'b':4}
swap(mydict)
print("swap函数里面a,b的值分别是",mydict['a'],mydict['b'])

在这里插入图片描述
在这里插入图片描述
可以观察地址:

def swap(mydict):
    print("swap函数里面mydict的值",id(mydict))
    mydict['a'],mydict['b'] = mydict['b'],mydict['a']
    print("swap函数里面a,b的值分别是",mydict['a'],mydict['b'])

mydict = {'a':3,'b':4}
print("swap函数之前里面mydict的值",id(mydict))
swap(mydict)
print("swap函数里面a,b的值分别是",mydict['a'],mydict['b'])
print("swap函数之后里面mydict的值",id(mydict))

在这里插入图片描述
6.lambda表达式

  • python使用lambda来创建匿名函数
  • lambda只是一个表达式,而且只能是单行表达式。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda par ameters:expression
等价:
def < function>( parameters):
	return expression
sum = lambda x,y : x+y
print(sum(1,2))

def sum2(x,y):
    return x*y

print(sum2(1,2))

在这里插入图片描述

高级特性

5.1函数生成器

def fib2(num):
    n,a,b=0,0,1
    while n < num:
        yield b
        a,b=b,a+ b
        n+1
print(fib2(6))
g=fib2(6)
print(next(g))
print(next(g))
print(next(g))
print(next(g))

在这里插入图片描述
可控制的斐波那契函数生成器:

def fib4():
    n,a,b=0,0,1
    while True:
        yield b
        a,b=b,a+ b
        n+1
g = fib4()
for i in range(10):
    print(g.__next__(),end='\t')

在这里插入图片描述

  • yield语句与returm语句的作用相似,都是用来从函数中返回值。与retum语句不同的是,returm语句一旦执行会立刻结束函数的运行,而每次执行到yield语句并返回一个值之后会暂停或挂起后面代码的执行,并发送数据,下次通过生成器对象的next ()方法、内置函数next(). for循环遍历生成器对象元素或其他方式显式"索要”数据时恢复执行

5.2高阶函数

  • map
  • reduce
  • fiter

map为惰性计算,要一个给一个,而不是全算完
map(func, *iterables) -> map object

  • 接收两个参数,一个是函数,一个是Iterable可迭代的对象,
  • 作用:函数作用于序列中的每个元素
  • 返回值:一个iterator迭代器, map对象。注意: map返回的iterator是情性序列)
def fun(x):
    return pow(x,2)
print(list(map(fun,[1,2,3,4,5])))

在这里插入图片描述
reduce(func, iterable[ initializer)

  • 函数func接收两个参数
  • iterable可迭代对象
  • 作用:对序列中的第1、2个元素进行操作,得到的结果再与第三个数据用func函数运算,最后得到个结果,
import functools
from functools import reduce
print(reduce(lambda x,y:x+y,[1,2,3,4,5])) #((((1+2)+3+4+5)

在这里插入图片描述

import functools
import operator
print(functools.reduce(operator.add,[1,2,3,4,5]))
print(functools.reduce(operator.mul,[1,2,3]))
print(functools.reduce(operator.concat,['A','BB','C']))

在这里插入图片描述
flter(func or None, iterable) --> filter object

  • 两个参数,参数func,参数iterable可迭代对象
  • 作用: 函数依次作用于每个元素, 然后根据返回值是True还是False决定保留还是丢弃该元素: 第个参数没有, 则返回iterable
  • 返回值: filter对象
  • 这个也是惰性计算
print(list(filter ( lambda x : x%2 == 1,[1,2,3,4,5,6,7,8,9,10])))

在这里插入图片描述
5.3偏函数partial
使用偏函数去固定函数的某个参数值

import functools
def log(message,subsystem):
    print("%s:%s"%(subsystem,message))

server_log = functools.partial(log,subsystem='server')
server_log("Unable to open socket")

在这里插入图片描述
5.4修饰器(装饰器)
通过修饰器可为现有函数或类添加新功能。

  • 修饰器是在程序开发中经常使用到的功能。可以使用修饰器(Decorator) 为现有的代码添加功能。
  • 这种使用一部分程序在编译时改变剩余部分程序的技术,被称为元编程(Metaprogramming)
  • 为了理解修饰器,我们必须再次强调个概念,即Python中 切都是对象,包括函数。所以函数也可以作为另一个函数的返回值或参数。
  • 任何实现了call方法的对象都是可调用对象。函数和方法通常被称为可调用对象(Callable)
  • 一个基本的修饰器接收一个函数,然后向其添加功能,最后返回这个函数。
#可以通过把@符号加修饰器的名称放在斋费修饰的函数上方来实现
def make_pretty( func):
    def inner( ):
        print("I got decorated")
        func( )
    return inner
#ordinary=make_pretty(ordinary)
@make_pretty
def ordinary():
    print("I am ordinary")
ordinary( )

在这里插入图片描述
5.6模块化编程

  • 内置模块
  • 第三方模块
  • 自定义模块

5.7PyInstaller打包
在创建了独立应用( 自包含该应用的依赖包)之后,希望将Python 程序生成可直接运行的程序,这样可以分发到对应的Windows或Mac0SX平台上运行,而不依赖于解释器和相应的包
1.打开cmd
2.输入pip install pyinstaller
3.输入pyinstaller - 文件路径\xxx.py
4.生成exe文件

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值