函数

  计算机中的函数和数学中的函数不是一回事,而是一个subroutine 、子程序、procedures、过程。

  作用:

  1、减少重复代码;

  2、方便修改,更易扩展;

  3、保持代码的一致性。

最简单的一个函数程序:

  def f():                                       #函数名的命名规则与变量的命名规则相同

    print("ok")        

  f()                                              #调用的时候一定要记得加括号,因为定义一个函数的时候,如果不加括号

                那它只是一个变量

  def add(a,b)                              #这里的a,b就是形参,下面的7和5是实参,都是一一对应的

    print(a+b)                              在函数没有被调用的时候,它只是被print到了内存里 >>>>>>12

  add(7,5) 

 

  如何实现动态效果呢?

  def f(index):

    print("function %s"% index)

  f(5)                                       >>>>>>function 5    #这就实现了动态输入,index是几就输入几

  这里要强调一下格式化输出:

  f.write("%s end action %s \n"%(time_current,n))

简单的函数代码,避免重复代码的:

 

def action1 (n):
    print("starting action1...")
    with open ("日志记录","a") as f:
        f.write("end action %s \n"% n)

def action2 (n):
    print("starting action2...")
    with open ("日志记录","a") as f:
        f.write("end action %s \n"% n)
def action3 (n):
    print("starting action3...")
    with open ("日志记录","a") as f:
        f.write("end action %s \n"% n)
action1(1)
action2(2)
action3(3)

 

这个代码就显得用点啰嗦,因为每一个函数里面都包含

with open ("日志记录","a") as f:
        f.write("end action %s \n"% n)这样的重复代码,这时就可以将重复的代码写成函数。

import time
def function(n):
    time_format="%Y-%m-%d %X"    #格式化输出
    time_current=time.strftime(time_format)    #输出当前的时间
    with open ("日志记录","a") as f:
        f.write("%s end action %s \n"% (time_current,n))

def action1 (n):
    print("starting action1...")
    function(n)

def action2 (n):
    print("starting action2...")
    function(n)
def action3 (n):
    print("starting action3...")
    function(n)
action1(1)
action2(2)
action3(3)

 

 

效果是一样的,都是新建一个日志记录的文档,在里面输入

函数的相关参数:

  def print_info(name,age):

    print ("Name:%s"% name)

    print("Age:%s"% age)                                        >>>>>>name:menheng

  print_info("mengheng",25)                                                       age:25               #必须参数

  print_info(name="mengheng",age="25")                                                          #关键字参数

不定长参数:

  高大上的加法器:

def add(*args):             #参数前面加个*表示不定长参数,用来存无命名的参数
    print(args)               
    Sum=0
    for i in args:
        Sum+=i
    print(Sum)
add(1,2,3,4,5)

 

 

请注意一般正常输入的不定长参数*arg都是以元组的形式输出,而如果在输入一个列表为[1,2,3]

输出的只能是([1,2,3],)为元组的一个元素,如果非要输出(1,2,3),则要在后面引用的f(*[1,2,3])

在括号里面加入*,同理**kwargs则是以字典的形式输出在下面的有命名参数中f(**{"name":"mengheng"})

这样就是传了字典过去。

 

def print_info(*args,**kwargs):
    print(args)
    print(kwargs)
print_info(*["alex","18","male"],job="IT",hobby="girls",height="188")  #分为有命名的和没有命名的

 

 

 

>>>>>>('alex', '18', 'male')
            {'job': 'IT', 'hobby': 'girls', 'height': '188'}

  关于不定长的位置:*args放在左边,**kwargs参数放在右边。

  所以函数参数的优先级就是从左到右

  def func (name,age=22,*args,**kwargs)             #从左到右就是关键字参数,默认参数,不定长参数

函数的返回值:

  def f():

    print("ok")

    return 10  

  a=f()

  print(a)           

>>>>>>ok

              10                               #返回值的作用:1、结束函数  2、返回某个对象

  注意点:1、如果函数没有返回值,那它的返回值就是none

      2、如果return多个对象,那么python会帮我们把多个对象封装成一个元组返回。

函数的作用域:

  python使用的LEGB的顺序来查一个符号对应的对象

  locals-->enclosing-->globals-->builtins            

  对应的是:局部变量--》闭包空间--》全局变量--》内建模块

      低级----》高级                低级只能看和输出,但是并不能改变高级变量

count=10                            #定义了一个全局变量
def outer():
    global count                    #在改全局变量的时候必须要声明一下
    print(count)
    count=5
    print(count)
outer()

 

 找变量的时候必须是从里到外找(只能看和输出,不能改),不能从外向里找,如果要改就要声明一下。

def outer():
    count = 10
    def inner():
        nonlocal count
        print(count)
        count=5
        print(count)
    inner()
    print(count)
outer()
>>>>>>10
    5
    5
 
Posted on 2018-02-27 11:26  小萝卜头12138  阅读(304)  评论(0编辑  收藏  举报