python ---------函数

一、为什么要使用函数?

  因为如果没有函数我们平时的代码就会有很多重复

  避免代码重用

  提升代码的可读性

二、函数的定义与调用:

  

1def  函数名(参数1,参数2)

    ''' 函数注释'''

    print('函数体')

    return 返回值

函数就是封装一个功能

定义:

  def 关键字开头,空格之后接函数名和圆括号,最后加一个冒号

  def是固定的不能改变

函数名的定义和变量一样 :数字字母下划线 任意组合 ,不能是数字开头  不能是关键字  要具有可描述性

函数的调用

返回值=函数名(参数1,参数2)#记得函数名后面加括号

下面我们先来定义一个求计算字符串长度的函数。假如我们的len()函数现在不能用了,那么我们就需要定义一个函数,求字符串的长度。如果让我们一次一次的去写相同的代码,会显得很麻烦。这时候我们的函数就上场了。

def length():
    s= 'hello world'
    length = 0
    for i in s :
        length +=1
    print(length)
print(length())    #因为没有返回值你打印最后会显示一个null
def length():
    s= 'bjbbabjsaofsa'
    num = 0
    for i in s:
        num +=1
    return num   
m = length()
print(m)
# print(length())#return的时候你可以定义一个变量来接收 也可以不接收直接打印 但是如果print就不可以 但是一般最好不要在函数中写print太lowle 
View Code

函数的返回值:

定义函数一般不要在函数中写print

return

1、在函数中遇到return就结束函数

2、将值返还给函数的调用者

  无return

    return None

  return一个值该值是什么就返还什么

大家看一下对与函数中只能存在一个return 因为第一个碰到return就把函数结束了

>>> def func(a, b ,c):
    return a
    return b

>>> print(func(3, 7, 8))
3     #只返回第一个return的3  因为碰到第一个return就把函数结束了 其他的return 存在的没有意义了
>>> 

 

 

  

函数的传递参数:

  两个方面:

  实参角度:

  1形式参数和实际参数

  

def my_len(a): #这个a就是形式参数 用来接收实际参数的
    return l
print(my_len(3))  #实际参数 实实在在存在的
View Code

 

  2位置传参 一  一对应

  

def func(a, b ,c):
    return a, b, c
print(func(2, 3,700))   #一一对应并且是当作一个元组打印出来

  3、混合传参----->关键字永远在最后面

  

def func(a, b=30 ,c): #形式参数和实际参数的一样都是直接赋值的要放在最后不然会报错,这个你看b直接赋值了但是放在了中间就报错
    return a, b, c,
print(func(2, 3,b=700))

 

  

def func(a, c ,b=40):
    return a, b, c  #这个就是对的  就是全部都放在后面
print(func(2, 3,b=700))

如果你return的好几个值都在一起return那么最后的返回值显示出来就在一个元组内

 

3,函数名可以作为函数的参数。
def func():
pass
def func1(a):
a()
func1(func)
4,函数名可以作为函数的返回值。
def func1(a):
return a
func1(func)()

 

 

 

默认传参:

def Info(username,sex=''):  #定义一个默认参数  sex
    with open('one',encoding= 'UTF-8',mode = 'a')as f :  #a就是追加内容
        f.write('{}\t{}\n'.format(username,sex))
while True :
    username= input('输入您的姓名:(男生为1开头)').strip()
    if '1' in username :
        username =username[1:]
        Info(username)
    else :
        Info(username,sex='')
View Code

 函数的动态参数:

因为我们的静态参数只能接收固定的  不能接收哪些不确定的或者多余的变量

动态参数,也叫不定长传参,就是你需要传给函数的参数很多,不定个数,那这种情况下,你就用*args,**kwargs接收,args是元祖形式,接收除去键值对以外的所有参数,kwargs接收的只是键值对的参数,并保存在字典中。

按位置传值多余的参数都由args统一接收,保存成一个元组的形式       

按照关键字传值接收多个关键字参数由kwargs接收 保存成一个字典的形式

 

# def Func(a,*args,b=''):
#     print(a)
#     print(b)
#     print(*args)
# Func(3,2,3,4,b='')

# def n (a,b,c,**kwargs):
#     print(kwargs)
#
# n(1,2,3,d=5,f=6)
# def func(*args):
#     print(args) #(1,2,30,1,2,33.。。。。。)
# l1 = [1,2,30]
# l2= [1,2,33,21,45,66]
# func()
# def Func(*args):
#     print(args)
#
#
# li={'name':1,'age':5}
# l1 = [1,2,30]
# l2= [1,2,33,21,45,66]
# Func(*li)
# def Nu(a,b,*args,sex='麻痹'):
#     print(args)
#     print(sex)
# Nu(3,6,'pfapifuafjfbsa',sex='弄哈')
# def N():
#     print(a,*args,**kwargs)
#     print(args)
#     # print(kwargs)
#     print(kwargs)
#
#
# N(1,'2345',b=12)
#*agrs  动态参数  万能参数

#args 动态参数 接收的就是实参对应的 所有位置参数 并将其放在元组中
#位置参数  *args 默认参数
# def func (a,b,c,*args,e=''):
#     print(a)
#     print(b)
#     print(c)
#     print(args)
#     print(e)
# func(1,2,3,4,5,6,e='')
#**kwargs
# def func(a, b,c, d, *args, e='',**kwargs):
#     print(a)
#     print(b)
#     print(c)
#     print(d)
#     print(args)
#     print(kwargs)
# func(1,2,3,4,5,m=9)

# 最终顺序:位置参数,*args 默认参数 **kwargs
# def func(a,b,c,e='laowang',*args):
#     print(a)
#     print(b)
#     print(c)
#     print(e)
#     print(args)
# func(1,2,3,4,7,8,89)  #如果默认参数放在args之前那么传值就会把args给传递给默认参数一个 把它给覆盖了 所以一般不这样做

# *的魔法运用
# def func(*args):
#     print(args)
#
# # l =[1,2,3]
# # l2=[1,2,3,4,5,6]
# l=(1,2,3,4)
# l2=(2,3,4,5)
# func(*l,*l2)  #*号可以把两个列表元组给传递进函数内 然后转化位一个元组中 因为*args接收完 那么用args输出后就会把所有的元素都放在元组中

# def func(*args):
#     print(args)
#
# l = [1,23,4,56,78]
# l1=[1,2,3,4]
# a={'name':'alex','age':12}
# func(*a)  #如果是字典运用*号然后再把字典让args接收的话就会把字典中的key值给放在元组中打印出来
# func(*l,*l1) # *星号可以放列表  字符串  元组 字典(字典只是显示key值),int类型是不可以放进去的
# def func(**kwargs):
#     print(kwargs)
# dic ={'name1':'alex','age1':47}
# dic1={'name':'old_man','age':56}
# func(**dic,**dic1)

#单个的*可以接收不同的列表、元组、字符串内的相同的元素 因为它可以把相同的元素 变成同一个,而**两个星号不可以接收两个人不同的字典内的相同的key就是用**组合两个字典 这两个字典内不可以出现相同的key

#在函数的定义时, *rags、**kwargs# 代表的是聚合
# def func(*args,**kwargs):
#     print(args)
#     print(kwargs)
# dic1 = {'name1':'alex','age1':46}
# dic2 = {'name':'老男孩','age':56}
# func(*[1,2,3,4],*'jkbabl',**dic1,**dic2)   *和 **可以同时使用的
#

# def func(*args,**kwargs):
#     print(args)
#     print(kwargs)
#
# dic1 = {'name1':'alex','age1':46}
# dic2 = {'name':'老男孩','age':56}
# func(*[1,2,3,4],*'bjbfbabfa',**dic1,**dic2) #字符串如果打散放入args中就会以单独的字符串类型的形式放入进去
View Code

 

*args必须放在默认参数之前放在位置参数之后 ,**kwargs必须放在最后 也就和静态参数一样 默认参数都在最后 而**kwargs接收的是赋值的默认参数 所以必须放在最后

 

 

 

 

 

 

 

 


 

posted @ 2018-03-28 17:27  可爱的红领巾  阅读(166)  评论(0编辑  收藏  举报