• Python进阶函数


    一.函数的动态参数

    之前我们说过了传参, 如果我们需要给一个函数传参, 而参数又是不确定的. 或者我给一个函数传很多参数, 我的形参就要写很多, 很麻烦, 怎么办呢. 我们可以考虑使用动态参数.

    动态参数分成两种:

    1. *args 动态接收位置参数

    动态接收参数的时候要注意:动态参数必须在位置参数后面

    1 def xue(*language,'a','b'):
    2 
    3   print('我要学:',language,a,b)
    4 
    5 xue('PHP',JAVA,'Python')

    如果这个程序不遵循顺序的话就会报错,如上面代码,因为前面传进去的所有位置参数都给*language接收了,a和b永远也接收不了参数

     所以必须改写成如下代码:

    1 # -*- coding:utf-8 -*-
    2 def xue(*language,a,b):
    3     print('我要学:',language,a,b)
    4 xue('JC','PHP',a='java',b='Python')  #必须用关键字指定参数

     这个时候a和b就有值了, 但是这样写呢位置参数就不能用了. 所以. 我们要先写位置参数,然后再用动态参数

    1 # -*- coding:utf-8 -*-
    2 def xue(a,b,*language):
    3     print('我要学:',a,b,language)
    4 xue('JC','PHP','java','Python')     #前两个参数用位置参数来接收,后面的参数用动态参数接收

    哪默认值参数呢?

    这个时候我们发现所有的默认值都生了. 这个时候如果不给出关键字传参. 那么你的默认值是永远都生效的.

    要记住的顺序: 位置参数, 动态参数*, 默认值参数

    2. **kwargs 动态接收关键字参数

    在python中可以动态的位置参数, 但是*这种情况只能接收位置参数⽆无法接收关键字参数.

    在python中使⽤用**来接收动态关键字参数

    1 def xue(**kwargs):
    2     print(kwargs)
    3 xue(a='Python',b='PHP',c='vb')

     这个时候接收到的都是dict(字典)

    顺序问题,在函数调用的时候,如果先给出关键字参数,则整个函数都会报错

    1 def xue(a,b,c,d):
    2     print(a,b,c,d)
    3 #关键字参数必须在位置参数前面,否则参数会混乱至报错
    4 xue(1,2,c='Python',666)

    所以关键字参数必须在位置参数后面. 由于实参是这个顺序. 所以形参接收的时候也是这
    个顺序. 也就是说位置参数必须在关键字参数前⾯面. 动态接收关键字参数也要在后面
    最终顺序(*):
    位置参数 > *args > 默认值参数 > **kwargs

    函数的注释:

    1 def XUE(JAVA,PHP):
    2     """
    3     这个函数是用来总结学的编程语言,
    4     :param JAVA: 参数Java是Java语言
    5     :param PHP: 参数PHP是PHP语言
    6     :return: 返回的是什么东西
    7     """
    8     print(JAVA,PHP)
    9     return  '坚持'

    二.命名空间

    在python解释器开始执行之后, 就会在内存中开辟一个空间, 每当遇到一个变量的时候, 就把变量名和值之间的关系记录下来, 但是当遇到函数定义的时候, 解释器只是把函数名读入内存, 表示这个函数存在了, 至于函数内部的变量和逻辑, 解释器是不关心的. 也就是说一开始的时候函数只是加载进来, 仅此而已, 只有当函数被调用和访问的时候, 解释器才会根据函数内部声明的变量来进行开辟变量的内部空间. 随着函数执行行完毕, 这些函数内部变量占用的空间也会随着函数执行完毕而被清空

    1 def xue():
    2     a = 'YJ'
    3     print(a)
    4 xue()
    5 print(a)    #a已经不存在了已经

     1. 内置名称空间:存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间

    2. 全局名称空间:我们直接在py⽂文件中, 函数外声明的变量都属于全局命名空间

    3. 局部名称空间:在函数中声明的变量量会放在局部命名空间

    作用域:

    1. 全局作用域: 内置+全局      查看全局作用域globals()

    2. 局部作用域: 局部(函数被调用)    查看局部作用域locals()

    三,函数名的运用

    函数名是一个变量, 但它是一个特殊的变量, 与括号配合可以执行函数的变量

    1.函数名的内存地址

     2. 函数名可以赋值给其他变量

     3. 函数名可以当做容器类的元素

     4. 函数名可以当做函数的参数

     5. 函数名可以作为函数的返回值

    四.函数嵌套

    函数可以互相的嵌套

    1.只要遇见了()就是函数的调用,如果没有()就不是函数的调用

    2.函数的执行顺序

    五, global和nonlocal关键

    global:在局部访问全局中的内容

    1 a = 10 # 全局变量本身就是不安全的, 不能随意修改, 闭包
    2 def func():
    3     global a  # 1. 可以把全局中的内容引入到函数内部 , 2. 在全局创建一个变量
    4     # a = 20
    5     a += 10 # a = a+10
    6     print(a)
    7 func()
    8 print(a)
    9 a = 10
    #结果为,20,20

    nonlocal:在局部寻找外层函数中离他最近的那个变量

     1 a = 10
     2 def outer():
     3     a = 'yj'
     4     def inner(): # 在inner中改变a的值
     5         nonlocal a # 寻找外层函数中离他最近的那个变量
     6         a = 20
     7         print(a)8     inner()
     9 outer()
    10 print(a)
  • 相关阅读:
    Nhibernate多表查询解决办法
    Nhibernate compositeid class must override Equals()解决办法
    SQLSERVER2005安装说明
    IList转化为Dataset C#
    Named SQL queries
    把object转换成DataSet,进行数据绑定
    使用Lucene检索文档中的关键字
    使用代理为业务操作添加安全检测
    mongodb副本集架构搭建
    Java生成中文验证码
  • 原文地址:https://www.cnblogs.com/yjtxin/p/11817092.html
Copyright © 2020-2023  润新知