• python


    在许多编程语言中都存在函数,python也不例外。

    函数是将单一或者相关联的功能打包的代码段。函数将代码打包,外界只需要调用接口,不必知道其实现过程

    函数的意义是代码复用,一次定义多次使用,不仅减轻了代码工作者的作业,而且使得程序的架构更加完善,更改,维护得到提升,扩展性更强(不用类的情况下)

    python中的函数分为 内置函数 和 用户自定义函数。

    内置函数此处不讲,下面我们看看用户自定义函数

    在python中,函数名的命名符合变量命名规则,一般就用驼峰式或用下划线连接,如下:

    1 >>> 
    2 >>> def MyFirstFunc():       #驼峰命名,这样可以按照大小写区分一个单词,读懂函数名的意思
    3     pass        
    4                  #这里定义的空函数
    5 >>> 
    6 >>> def my_first_func():     #用'_'连接,个人觉得更清晰,所以一般自用这种方式命名函数,用驼峰式命名类
    7     pass
    8 
    9 >>> 

    python定义函数的固定格式:

        def function_name([arg1[,arg2...]]):

        return

    说明:

         def: 是 define function ,定义函数说明,python解释器在读到 def 时,就会把其后的代码块当成一个函数,此时python解释器不会把函数的代码

    读到内存中,跳过整个代码块继续读后面的代码,当函数被调用时,python解释器才会去解释执行函数的代码块。

         function_name:  用户自定义的函数名,注意不要与python里面存在的函数重名,否则相当于重写内置函数,若不需要,尽量避免。在定义完成后,

    函数名就相当于函数在内存中地址的一个引用,此时若直接打印函数名,则会返回函数的内存地址

         () :在定义时的固定格式,里面可以没有参数,也可以有参数(参数可以是python中各种数据结构)。在调用时,函数名() 表示执行函数,所以经常在

    给函数名创建引用后,给引用加个()就能执行函数

         [arg1[,arg2...]] : 表示可选参数

         ' : '   :固定写法,指明下面是属于当前行的代码块

         return : 函数中的出口。当函数在执行到return时,当前函数会结束执行(后面的代码将不会执行),并把return后面的值(或表达式)返回,此时可以用

    一个变量来接收函数的返回值,当一个函数中没有定义return时,这个函数也有返回值,默认返回None

     1 >>> 
     2 >>> def hello(name):
     3     print('hello %s' %name)
     4     return 'hello everyone!'
     5     print('just test')            #没有被执行
     6 
     7     
     8 >>> h = hello('root')      # hello() 表示调用函数   
     9 hello root
    10 >>>h
    11 'hello everyone!' 12 >>>

    参数

        在python中,参数是没有类型的,类型是属于对象。eg:

    1 >>> 
    2 >>> l = [1,2,3,'a']
    3 >>> s = 'hello'
    4 >>> 

        上面的 [1,2,3,'a'] 是List类型,'hello' 是String类型,而变量 l、s 是没有类型的,她仅仅是一个对象的引用(一个指针),可以是 List 类型对象,

    也可以指向 String 类型对象。

     

    在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。

    • 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。

    • 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。

    python 函数的参数传递:

    • 不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。

    • 可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响

    对上面传递不可变对象,eg:

     1 >>> 
     2 >>> def test(a):
     3     a = 10            # a 是一个局部变量,只是作用在函数test内部,出了函数,是不能调用它的
     4 
     5     
     6 >>> b = 2
     7 >>> test(b)     #因为b=2,是numbers,不可变类型,所以这里传递的是值2,即test(2),所以函数里面的更改与 b 无关 
     8 >>> b
     9 2
    10 >>> a
    11 Traceback (most recent call last):
    12   File "<pyshell#40>", line 1, in <module>
    13     a
    14 NameError: name 'a' is not defined
    15 >>> 

    对上面可变类型,eg:

     1 >>> l = [1, 2, 3, 4, 5]
     2 >>> def change_list(ol):
     3       if len(ol) >= 3:
     4           ol[2] = 'hello'
     5           return 'just test'
     6       else:
     7           print('Not change everything')
     8 
     9  
    10 >>> cl = change_list(l)
    11 >>> l
    12 [1, 2, 'hello', 4, 5]
    13 >>> cl
    14 'just test'
    15 >>> 

    python 中一切都是对象,严格意义我们不能说 值传递 还是 引用传递,我们应该说传 不可变对象 和传 可变对象 。

    传递给函数的参数也有很多种形式:

        关键字参数: 实参位置与形参位置按顺序一一对应

     1 >>> 
     2 >>> def say_hello(name1,name2):
     3     print('name1:',name1)
     4     print('name2:',name2)
     5     return 'just test'
     6 
     7 >>> sh = say_hello('admin','root')
     8 name1: admin
     9 name2: root
    10 >>> sh = say_hello('root','admin')
    11 name1: root
    12 name2: admin
    13 >>> 

        指定参数: 类似键值对,对传递参数的位置顺序无关

     1 >>> 
     2 >>> def say_hello(name1,name2):
     3     print('name1:',name1)
     4     print('name2:',name2)
     5     return 'just test'
     6 
     7 >>> sh = say_hello(name2='admin',name1='root')
     8 name1: root
     9 name2: admin
    10 >>> 

        默认参数: 在函数定义时为参数赋初值,防止后面没输入报错 (注意:有默认值的参数放在最后)

     1 >>> 
     2 >>> def user_info(name,age,hobbie='python'):
     3     print('%s is %s year old and his hobbie is %s' %(name,age,hobbie))
     4 
     5 >>> ui = user_info('root',22,'php')
     6 root is 22 year old and his hobbie is php
     7 >>> ui = user_info('root',22)
     8 root is 22 year old and his hobbie is python
     9 >>> type(ui)
    10 <class 'NoneType'>
    11 >>> 

       动态参数:参数可变,自动把传入的参数转换为元祖或字典

            前面有一个*,如 *args 表示 会把接受到的 非键值对形式 的所有参数放进一个元祖里面

       前面有两个*,如 **kwargs 表示 会把接收到的 键值对形式 的所有参数放进一个字典里面

        注意:键值对形式的参数必须放在最后面 

     1 >>> 
     2 >>> def collect_func(*args,**kwargs):
     3     print('your input *args:',args)      # * 只是指明后面的参数是(元祖)收集参数,并不是变量名的一部分,同理,** 也是(字典)收集参数
     4     print('your input **kwargs:',kwargs)
     5 
     6     
     7 >>> collect_func(1,2,'hello',[5,6],'a',name='root',age=22)
     8 your input *args: (1, 2, 'hello', [5, 6], 'a')
     9 your input **kwargs: {'name': 'root', 'age': 22}
    10 
    11 >>> collect_func(1,2,'hello',age=22,[5,6],'a',name='root')
    12 SyntaxError: positional argument follows keyword argument
    13 >>> 

    变量作用域:

            在函数内部定义的变量为局部变量,仅在函数内有用,出了函数就无法访问。全局变量易于访问,但不易于修改。

            若要在函数内部定义一个全局变量,可用 global  eg: 在函数内:  global x = 10  (global会影响执行速度,并且不安全,不建议这样用)

        注意:

        在函数内部修改全局变量(如重新赋值),python会自动新建一个与全局变量名字相同的局部变量。全局变量存在于栈中,局部变量

            存在于其他地方,所以互不影响

    闭包:

          闭包使用实例:装饰器

          注意:

            使用函数时:在函数内部和程序其他部分可以使用的变量不同,在函数内应该只是使用通过参数传递进来的变量,而在函数外部,应该只使用接收函数返回值的变量

     1 >>> 
     2 >>> def func1():
     3     print('func1正在被调用...')
     4     def func2():
     5         print('func2正在被调用...')
     6     return func2
     7 
     8 >>> a = func1()
     9 func1正在被调用...
    10 >>> a()
    11 func2正在被调用...
    12 >>> func2()           #不能直接从外部调用某个函数的内嵌函数 ,内嵌函数的作用域都在外部函数内     
    13 Traceback (most recent call last):
    14   File "<pyshell#57>", line 1, in <module>
    15     func2()
    16 NameError: name 'func2' is not defined
    17 >>> 

    匿名函数:

        lambda 表达式

        作用:

       1、在使用函数时,用lambda表达式可以省下定义函数的过程

         2、简化代码可读性

     1 >>> 
     2 >>> g = lambda x,y:x+y
     3 >>> g(3,5)
     4 8
     5 >>> 

            说明:lambda后面空格,然后跟变量,有多个变量用 ' , ' 隔开,' : '是参数和函数体的分割点,' : '后面表示是函数体,

        给lambda 表达式创建引用(一个指针) g ,使g指向lambda表达式的地址,再加上 () 执行lambda 表达式

    过滤器:

      作用:筛选,把满足条件的去掉,留下的生成一个filter object,可用list将其转化

     1 >>> 
     2 >>> #用法:filter(function or None , iterable)
     3 >>> 
     4 >>> l = [1,0,3,'a',False,True]
     5 >>> filter(None,l)
     6 <filter object at 0x0000014EC44EBBA8>
     7 >>> list(filter(None,l))
     8 [1, 3, 'a', True]
     9 >>> 
    10 >>> #用filter写一个筛选奇数的函数
    11 >>> 
    12 >>> def singnal_num(x):   #这里用lambda改进: lambda x:x%2  
    13     return x%2
    14 
    15 >>> ls = range(10)
    16 >>> show = filter(singnal_num,ls)     #show = filter(lambda x:x%2,ls)
    17 >>> list(show)
    18 [1, 3, 5, 7, 9]
    19 >>> 

    映射:map()

      将序列的每一个元素作为函数的参数(对应除默认参数外,只能传递一个)进行运算加工,直到把序列的所有元素加工完毕,返回所有加工后的元素构成的新序列

     1 >>> 
     2 >>> #用法: map(规则函数,迭代器)    
     3 >>> 
     4 >>> m = map(lambda x:x*2,range(10))
     5 >>> list(m)
     6 [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
     7 >>>
     8 >>> [i for i in m]
     9 [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    10 >>> 

      

  • 相关阅读:
    linux下,webpack热重载无效的解决方法
    前端异步编程之Promise和async的用法
    防呆设计(内容摘录)
    GUI 图形用户界面 [学习笔记]
    15条JavaScript最佳实践【转】
    2013-11-02 【webrebuild广州站】分享会纪要
    关于自控力
    记录一次抖音小程序严重bug(组件样式继承问题)
    微信 头条小程序 记录一次电商项目倒计时活动优化
    微信/头条小程序如何确保异步请求执行完后再执行各页面的onLoad方法
  • 原文地址:https://www.cnblogs.com/xtsec/p/6678340.html
Copyright © 2020-2023  润新知