函数

函数

1. 什么函数

可以实现一些特定功能的方法

优点:

简化代码结构,增加代码的复用度

提高代码可读性,方便维护

2. 函数定义

def  函数名():

  函数体

函数名: 遵循标示符命名规则

注意:

        函数调用,先定义,后调用

        同一个模块里, 函数可以重名,但是会被覆盖

        函数区分大小写

defspeaker():

print("你们是最棒的~")

3. 函数定义方式

普通定义方式:

defspeak():

print("普通方式")

带有参数函数

defadd(x,y):# x,y 形参

    print(x+y)

add(100,200)# x,y 实参

带默认值参数

错误形式:

defadd(x=10,y):# 形参中,不全都带默认值情况下, 默认值参数要靠后

print(x,y)

更正后:

defadd(x,y=10):

    print(x+y)

总结:

1. 如果定义函数有形参, 但是没有默认值, 那么调用时候,必须传递实参,且实参个数必须与形参相等

  2. 函数定义的时候,如果形参有默认值,那么传递的实参,会将默认值覆盖,不传递,也无所谓

  3. 函数形参不全有默认值,那么在定义过程中,默认值参数靠后

关键字参数

定义: 可以使用关键字,来改变形参和实参默认顺序

注意: 要么都给,要么都不给

defkeyArgs(x,y):

    print("x的值{},y的值{}".format(x,y))

keyArgs(10,x=20)

TypeError:keyArgs()gotmultiplevaluesforargument'x'

注意: 

如果有形参并且没有默认值,实参中如果第一个给了关键字,其他都需要给

defkeyArgs(x,y):

    print("x的值{},y的值{}".format(x,y))

keyArgs(x=10,20)

正确形式:

keyArgs(x=10,y=20)

实参赋值时候,如果顺序不固定,形参名 = 实参

def keyArgs(x,y):

print("x的值{},y的值{}".format(x,y))

keyArgs(y=10,x=20)

如果形参都有默认值, 第一个设置形参名=实参,其他不需要给

def keyArgs(x=10,y=20,z=30):

print("x的值{},y的值{},z的值{}".format(x,y,z))

keyArgs(y=90)

4. 函数返回值

关键字: return

def demo():

return "py"

print("hello ai")

没有返回值时候: None

返回多个值

def value():

return [1,2,3,4,5,6,7,8,9,10]

v = value()

print(v)

5. 函数练习

模拟实现pop功能

def pop(l):

new_list = l[:-1]

return new_list

l = [1,2,3,4,5]

l = pop(l)

print(l)

模拟实现popitem()函数功能,并返回被删除键值对

import random

def pop_item(dict):

keys = dict.keys()

klist = list(keys)

# 随机选择key一个效果

key = random.choice(klist)

# 获取key 和 value

key,value = key,dict[key]

del dict[key]

return key,value

d = {"头条":"抖音","阿里巴巴":"闲鱼","腾讯":"微信"}

key,value = pop_item(d)

print(key,value)

定义一个函数,实现字典健值交换

第一种写法:

transDict = {"a":1,"b":2,"c":3}

transDict_new = {}

for key , value in transDict.items():

transDict_new[value] = key

print(transDict_new)

第二种写法:

transDict_new = dict([val,key] for key,val in transDict.items())

print(transDict_new)

# 第三种写法

transDict_new = dict(zip(transDict.values(),transDict.keys()))

# print(transDict_new)

一,函数

作用:封装一段功能

函数定义关键字:def

1.不定长参数

概述:传入参数个数不固定

(1)不确定参数名,以元组形势去接收

如:def print(self , *args,sep="",sep="",end="\n",file=None)

deffunc(*args):

print(args)

func(1,2,3,4,5)

输出结果:(1,2,3,4,5)

deffunc(a,b,*args):

print(a)

print(b)

print(args)

print("*"*10)

pow=a*b

forxinargs:

pow*=x

returnpow

zj=func(1,2,3,4,5)

print(zj)

结果:

1

2

(3,4,5)

**********

120

2.关键字参数

概述:不确定参数接收,必须是[关键字+值],形态是字典

# 关键字参数定义

deffunc(**kwargs):

# 打印关键字参数

    print(kwargs)

# 遍历每一个关键字参数

    forkeyinkwargs:

print(key,kwargs[key])

func(x=1,y=2,z=3)

3.*和**一起作为形参

# *args 和 **args在一起的时候,*args排在**kwargs前

deffunc(*args,**kwargs):

print(args,kwargs)

func(1,2,3,4,5=2,2=3)

4.实参为*args的情况

deffunc(a,b,c,d):

print(a,b,c,d)

l=[1,2,3,4]

func(*l)

5.实参为**kwargs的情况

deffunc(**dict):

print(dict)

d= {"z":"j","cx":"k"}

func(**d)

二,参数分为可变类型和不可变类型

不可变类型:整数,字符串,元组;不会影响参数本身

defcInt(a):

a=10

n=2

cInt(b)

print(b)

可变数据类型:列表,字典,集合;会影响到参数本身

defchangeList(1):

l.append([1,2,3,4])

print("函数内的列表:"l)

l= [66,33,1]

changeList(l)

print("函数外的列表:"l)

三,匿名函数

关键字:lambda

注意: 1.lambda只是一个表达式,函数体比def简单的多

2.封装的逻辑有限

实例

1.普通定义

add=lambdaa,b:1+b

print(add(10,20))

2.直接调用

(lambdaa,b:a+b)(a,b)

3.带有默认值参数

a=lambdaa=20,b=30:a+b

4.没有参数

a=2

b=3

c=lambda:a+b

四,递归函数

注意:自己调用自己,注意调用自己的深度,过多,计算机栈空间不足

满足条件终止

deffact(n):

ifn==1:

return1

returnn*fact(n-1)

print(fact(4))

函数

回顾

变量作用域

num=int(10)  # 内置变量 B

num=20      # 全局变量 G

defouter():

num=30    # 闭包变量 E

    definner():

num=40 # 局部变量 L

print(num)

returninner

i=outer()

i()

注意:访问顺序LEGB

列表中元素大小写转换

l=l= ["pY","IS","eASY"]

bs_list=[x.swapcase()foriinl]

print(bs_list)

迭代器

数据类型看并且可以使用for循环

1> list,set,tuple,dict,string

2> generator[生成器] 【第一种形式: (),函数结合yield】

deflg(num):

foriinrange(1,num):

yieldi

l=lg(10)

# 生成器保存是算法,而列表保存内容是在内存中,列表不占优势,耗内存,生成器节约内存开销

print(sum(l))

# 生成器只被使用一次

print(sum(l))

gs= (xforxinrange(1,10))

判断是否为生成器

fromcollectuons.abcimportiterable

isintance(gs,iterable)

关键字:

['False','None','True','and','as','assert','async','await','break','class','continue','def','del','elif','else','except','finally','for','from','global','if','import','in','is','lambda','nonlocal','not','or','pass','raise','return','try','while','with','yield']

装饰器

作用:程序代码运行时,动态增加功能

本质:就是一个闭包,返回了函数的高阶函数

好处:遵循开闭原则,对修改关闭,对扩展开放

defdemo():

    print("demo func")

deffunc():

    print("demo func")

    print("func")

func()

# y是形参,是函数

defdemo(y):

print("demo func")

y()

@demo

deffunc():

    print("func")

func是实参

带参数的装饰器

defdemo(func):

definner(age):

ifage<=10:

mystr="children"

elifage<=20:

mystr="midman"

else:

mystr="oldman"

returnfunc(mystr)

returninner

@demo

deffunc(p):

print("你是一个这样的",p)

# 调用

func(60)

栈和队列

特点:先进后出

具体化:羽毛球筒

my_stack = []

# 向栈进入数据

my_stack.append(23)

my_stack.append(22)

my_stack.append(21)

my_stack.append(20)

my_stack.append(19)

print(my_stack)

my_stack.pop()

print(my_stack)

my_stack.pop()

print(my_stack)

my_stack.pop()

print(my_stack)

my_stack.pop()

print(my_stack)

my_stack.pop()

print(my_stack)

结果:

[23, 22, 21, 20, 19]

[23, 22, 21, 20]

[23, 22, 21]

[23, 22]

[23]

[]

队列

特点:先进先出

import collections

queue = collections.deque([1,20,25,40])

print(queue)

# 入队一年

queue.append(68)

print(queue)

queue.append(77)

print(queue)

# 出队

queue.popleft()

print(queue)

queue.popleft()

print(queue)

你可能感兴趣的:(函数)