函数

函数基础

一.定义

不用函数的危害

1.逻辑机构不好

2.代码冗余

3.代码可维护性差

二.分类

1.内置函数

2.自定义函数

def 函数名(arg1,arg2...):

  '描述信息'

  函数体

  return 1

#先定义,后使用

三.有参函数,无参函数和空函数

1.无参函数

def foo():

  'foo funciton'

  print('from the foo')

#定义时无参,调用时无参

#无参函数不需要返回值,通常内部都是语句,只是执行语句,没有运行结果

2.有参函数

def bar(x,y):
print(x)
print(y)
print('from bar')
res=x+y
return res
z=bar(1,2)
print(z)
#函数的调用
#定义时有参,调用时有参
foo() #语句形式
res=bar(1,2) #表达式形式
res2=bar(bar(1,2),3)
有参函数一般要通过计算得到结果,通过return 赋值变量得到结果

x=len('hello')
print(x)
print(len('aaaa'))

3.空函数

def auth():
'认证'
pass
def list_goods():
'商品列表'
pass
def buy():
'购买'
pass
def interactive():
'与用户交互'
list_goods()
money=input(">> ")
goods=input(">> ")
buy(money,goods)


4.返回值


1.特点


函数的返回值没有类型限制,可以是任意类型
没有return---->返回none
return一个值----->1
return1,2,3----->(1,2,3) 元组
2.三种形式:

def my_max(x,y):
res=x if x > y else y #三元表达式
return res
res1=my_max(1,2)
print(res1)
返回一个

返回多个def bar(x,y):

return 1,2,3,[1,2],{'a':2},

res2=bar(1,2)
print(res2)
##返回元组形式了
##python里看到,默认翻译成元组形式

3.多个return
如果存在多个return返回值,return返回值只能返回一个(只能执行一次return)


5.变量解压c

x='hello'

a,*_,e=[1,2,3,4,5]
head,*_=[1,2,3,4,5] 只要开头的

6.形参和实参

1.定义

函数的参数:
def for(x,y)
定义阶段:形参----->本质就是变量名
定义变量名

调用阶段:实参 --> 必须有一个明确的值
变量值

2.实参

实参分三种格式

1. 按位置传递

#在实参的角度

def foo(x,y)
第一种:按照位置传值
foo(1,2)

第二种:按照关键字传值
foo(x=1,y=2)

第三种:混着用
foo(1,y=2) ##按位置传值必须在按关键字传值的前面
foo(y=2,1) 报错
foo(1,x=1,y=2) 报错 ##对一个形参只能赋值一次

3.形参

位置参数:

必须传值的参数def foo(x,y):


print(x)

print(y)

foo(1,2)
foo(y=2,x=1)

#默认参数

 y=1   sex=male


def foo(x,y=1):
print(x)
print(y)
foo(1)
打印出俩1
foo(1,2)
foo(y=2,x=1)

一般把变化比较小的值定义成默认参数

#默认参数必须放到位置参数的后面
def register(sex='male',name): #报错
print(name)
print(sex)

应该是

def register(name,sex='male'):
print(name)
print(sex)

register('liming')

liming
male


#定义阶段不会报错,调用阶段会报错
x='male'
def register(sex=x):
print(sex)
#----------------
x=None
register()
#输出
#male

x=[]
def register(name,name_list=x):
name_list.append(name)
register('ASB')
register('YSB')
register('WSB')
print(x)

['ASB', 'YSB', 'WSB']

 

 


4.*args和**kwargs

 

*args


def foo(x,*args):    #args=(2,3,4,5,6,6,'a','b')     按位置传值多的给args
print(x)
print(args)
foo(1,2,3,4,5,6,6,'a','b')

#*args与位置参数和默认参数混用:*args要放到位置参数后面

例1.
def foo(x,*args,y=1): #位置参数,默认参数,*args
print(x)
print(y)
print(args)

foo(1,2,3,4,5)                 !!!!先按位置传值,再按关键字传值

1
1
(2, 3, 4, 5)

例2.

def foo(x,y=1,*args):
    print(x)
print(y)
print(args)

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

1
2
(3, 4, 5)


def my_sum(*nums): #nums=(1,2,3,4,5,6)
res=0
for i in nums:
res+=i
return res

从形参的角度
##*(1,2,3) = *args
def foo(*args):
  print(args)

foo(1,2,3)

(1,2,3)


从实参的角度
def bar(x,y,z):
  print(x)
  print(y)
  print(z)
bar(*(1,2,3))         ##bar(1,2,3)

1
2
3

 


**kwargs


def foo(x,**kwargs):       #把按关键字传值多余的值做成字典   x是位置,这题关键字只有一个
  print(x)       #核心是按关键字传值,关键字一定在位置的右面
  print(kwargs)
foo(1,y=2,a=3,b=4)

1
{'a': 3, 'y': 2, 'b': 4}

混着用的位置问题

例1.
def foo(x,*args,**kwargs):                      #按位置传值多的才给*args,一般给最前面的x,按关键字传值多的给**kwargs
  

  print(x)

  print(args)                #kwargs按关键字传值
  print(kwargs)

1
()
{'z': 2, 'y': 1}

例2.

def foo(*args,**kwargs):

print(args)
print(kwargs)
foo(1,1,1,1)

(1, 1, 1, 1)
{}

例3.

def auth(name,password,sex='male'):
print(name)
print(password)
print(sex)
def foo(*args,**kwargs):
print('from foo')
auth(*args,**kwargs)

foo('egon','123')

from foo
egon
123
male

def auth(name,password,sex='male'):
print(name)
print(password)
print(sex)
def timmer(*args,**kwargs):
print('from timmer')
auth(*args,**kwargs)

timmer(name='jax',password=123)

from timmer
jax
123
male



原文地址:https://www.cnblogs.com/jiangshitong/p/6674846.html