python--函数

Python基础-函数

为什么需要函数:

有时候,一些代码可能要在许多地方使用。如果采用传统的方式,一直重复编写相同的代码,那么代码将变得非常糟糕,并且非常难以维护。这时候我们就可以采用函数,来把一些重复执行的代码封装成一个函数,以后要再调用相同的代码的时候,就只要调用这个函数就可以了。

函数定义和调用:

  1. 定义函数:语法是使用def
     def 函数名(参数,可以为空):
         代码块
     # 示例:
     def greet():
         print('hello world')
    
  2. 调用函数:语法是使用这个函数的名字,后面再给个圆括号:
     函数名(参数,可以为空)
     # 示例:
     greet()
    
  3. 函数参数:函数可以传递参数进去给函数:

     def add(a,b):
         print(a+b)
    
    • 形参:就是在定义函数的时候指定的参数。

    • 实参:就是在调用函数的时候传递进去的参数。

    • 位置参数:位置参数就是按照形参中给定的参数的顺序。

       def add(a,b):
           print(a+b)
       # 调用add
       add(1,2)
      

      在上例中,调用add函数,给的值a为1,b为2。这种位置很重要的参数叫做位置参数。

    • 关键字参数:在传递参数的时候,可以按照形参的名字给定参数。

       def add(a,b):
           print(a + b)
       # 调用add
       add(a=1,b=2)
       # 调换a和b参数的顺序来调用add函数
       add(b=1,a=2)
      
    • *args和**kwargs:分别代表的是缺省的位置参数和关键字参数。

         def add(*args,**kwargs):
             print(args)
             print(kwargs)
         # 调用add
         add(1,2,a=3,b=4)
      

      其中1和2是位置参数,会保存在args中,a=3,b=4是位置参数,保存在kwargs中。
      传递到函数中的args是一个元组,kwargs是一个字典。

    • 元组和字典拆分出来成位置参数和关键字参数:

       a = ('a','b','c')
       b = {"username":"zhiliao","age":18}
       def greet(*args,**kwargs):
           print(args)
           print(kwargs)
       greet(*a,**b) # 将a这个元组个的元素一个个拆开来给`args`,将`b`拆开来一个个给`kwargs`
      
    • 默认参数:有时候一些参数,你可能需要给函数调用者,使用一个默认的参数,那么可以通过以下方式实现:

        def greet(name,age=18):
            print(name,age)
        greet('zhiliao') #age将使用18来作为默认参数
        greet('zhiliao',age=20) #age将使用20来作为默认参数
      

      默认参数一定要放在其他参数的后面,但是放在缺省参数的前面。

  4. 函数返回值:函数可以有返回值:

     def add(a,b):
         return a + b
    

    可以使用元组来返回多个值:

     def greet():
         return 'zhiliao',18
    

函数中变量的作用域:

  1. 局部变量:函数中的变量,不能在外面使用。
     def greet():
         name = 'zhiliao'
         print('my name is %s'%name)
     print(name) # 报错,因为name只在greet函数中有用
    
  2. 全局变量:全局变量是在函数或者某个代码块外面定义的变量,可以在函数中进行使用。
     username = 'zhiliao'
     def greet():
         print('my name is %s' % username)
     greet()
    
  3. global关键字:如果想在函数或者某个代码块中修改全局变量,那么应该使用global关键字。
     username = 'zhiliao'
     def greet():
         username = 'ketang' # 此时不是修改全局变量username,而是定义一个与全局变量相同名字的变量
         print('my name is %s' % username)
     greet()
     print(usernmae) # 这时候username仍然是`zhiliao`。
    
  4. 列表和字典当作全局变量:列表和字典当作全局变量,在函数或者代码块中使用的时候,可以任意的增删改查列表和字典的值。但是如果要修改这个全局变量指向的值,则必须加global关键字。

     persons = ['zhangsan','lisi']
     def add_person(name):
         persons.append(name)
     add_person('wangwu')
     print(persons) # 这时候persons已经变成['zhangsan','lisi','wangwu']了。
    

    而如果你直接修改persons的指向,但没有使用global关键字,那么做的操作,将是在本地申请一个局部变量:

     persons = ['zhangsan','lisi']
     def add_person():
         persons = ['wangwu']
     add_person()
     print(persons) # 仍然是'zhangsan'和`lisi`
    

匿名函数:

  1. 列表排序sort:使用sort给列表中的值进行排序的时候。如果列表中装的是字典,那么将不能正确的排序:

     l = [{'username':'zhangsan','age':18},{"username":'lisi','age':20}]
     l.sort()
    

    正确的写法应该是:

     l = [{'username':'zhangsan','age':18},{"username":'lisi','age':20}]
     def sort_key(x):
         return x['age'] # 根据年龄进行排序
     l.sort(key=sort_key)
    
  2. 以上是定义一个函数来作为key,但是这个key的函数只需要用一次,以后再也用不到了,因此一般这种情况,我们可以使用匿名函数,也即lambda表达式,可以更好的完成我们的需求:

     l = [{'username':'zhangsan','age':18},{"username":'lisi','age':20}]
     l.sort(key=lambda x:x['age'])
    
  3. 自己动手写一个需要函数作为参数的函数:我们可以模范python自带的sort函数来实现一个做计算器运算的函数,我们让用户输入值,和计算方式:

     def calculate(x,y,func):
         return func(x,y)
    
     # 实现一个加法计算器
     calculate(1,2,lambda x,y:x+y)
     # 实现一个减法计算器
     calculate(2,1,lambda x,y:x-y)
     # 实现一个乘法计算器
     calculate(1,2,lambda x,y:x*y)
     # 实现一个除法计算器
     calculate(4,2,lambda x,y:x/y)
posted @ 2019-10-09 09:54  莫斯科song  阅读(107)  评论(0)    收藏  举报