第四章 函数之参数、作用域

4.2 参数

  1. 形参、实参

      def get_data(a):#a为形式参数(或形参)     v = [1,5,6,,8,5]    print(v[a])    get_data(1)# 1在调用函数是传递叫:实际参数(实参)   # 严格按照顺序传参数:位置方式传参。   # 实际参数可以是任意类型。
  2. 基本参数

    • 任意个数
    • 任意类型
      def func(a1,a2,a3):       print(a1,a2,a3)       func(1,"asdf",True) # 1 asdf True
  3. 位置传参(调用函数并传入函数)【执行】

       def func(a1,a2):        print(a1,a2)    func(11,22) # 11 22
  4. 关键字传参 【执行】

      # 典例一      def func(a1,a2):          print(a1,a2)      func(a2=11,a1=22)   # 22 11?   # 典例二     def func(a1,a2):          print(a1,a2)    func(11,a2=22)  # 11 22
      • 位置传参>关键字传参(顺序)
      • 位置传参 + 关键字传参 = 总传参个数
      • 前面是关键字传参,后面也必须关键字传参
  5. 默认参数 【参数】 对于函数的默认值慎用可变类型

      # 如果要想给value设置默认是空列表?  # 不推荐(坑)    def func(data,value=[]):          pass ?   # 推荐    def func(data,value=None):        if not value:             value = []           # 练习        def func(data,value=[]):         value.append(data)    return value ?    v1 = func(1) # [1,]    v2 = func(1,[11,22,33]) # [11,22,33,1]
    • def func(a,b=[]) 有什么陷阱?

    # 典例一
    def func(a,b=[]):
        b.append(a)
        return b
    ?
    l1 = func(1)
    print(l1)   # [1]
    l2 = func(2,[11,22])
    print(l2)   # [11,22,2]
    l3 = func(3)
    print(l3)   # [1,2]
    ?
    # 示例二
    def func(a,b=[]):
        b.append(a)
        print(b)
    
    func(1) # [1]
    func(2,[11,22,33])  # [11,22,33,2]
    func(3) # [1,3]
    def func(a1,a2,a3=9,a4=10):
        print(a1,a2,a3,a4)
    ?
    func(11,22) # 11,22,9,10
    func(11,22,10)  # 11,22,10,10
    func(11,22,10,100)  # 11,22,10,100
    func(11,22,10,a4=100)   # 11,22,10,100
    func(11,22,a3=10,a4=100)    # 11,22,10,100
    func(11,a2=22,a3=10,a4=100)     # 11,22,10,100
    func(a1=11,a2=22,a3=10,a4=100)      # 11,22,10,100

  6. 万能参数【打散】

    1. *args

      • 可以接受任意个数的位置参数,并将参数转换成元组.

        • 调用函数无 *

              def func(*args):    print(args)?func((1,2,3,4)) # ((1,2,3,4),)func([1,2,3,4]) # ([1, 2, 3, 4],)
        • 调用函数有 *
          def func(*args):    print(args)?func(*(1,2,3,4))    # (1, 2, 3, 4)func(*[1,2,3,4])    # (1, 2, 3, 4)
      • 只能用位置传参
        def func(*args):    print(args)?func(1) # ()func(1,2) # (1,2) func((11,22,33,44,55)) # ((11,22,33,44,55),)func(*(11,22,33,44,55)) # (11,22,33,44,55)
    2. **kwargs
      • 可以接受任意个数的关键字参数,并将参数转换成字典。

        • 调用函数无 **

          def func(**kwargs):    print(kwargs)?func(k1=1,k2="alex")    # {‘k1‘:1,‘k2‘:‘alex‘}
        • 调用函数有**
          def func(**kwargs):    print(kwargs)func(**{‘k1‘:‘v2‘,‘k2‘:‘v2‘}) # {‘k1‘:‘v2‘,‘k2‘:‘v2‘}
      • 只能用关键字传参
      • 综合应用:无敌 + 无敌 => 真无敌
        def func(*args,**kwargs):    print(args,kwargs)?func(1,2,3,4,5,k1=2,k5=9,k19=999)#(1, 2, 3, 4, 5) {‘k1‘: 2, ‘k5‘: 9, ‘k19‘: 999}func([1,2,3],k1=2,k5=9,k19=999)# ([1, 2, 3],) {‘k1‘: 2, ‘k5‘: 9, ‘k19‘: 999}func([1,2,3],**{‘k1‘:1,‘k2‘:3})# (1, 2, 3) {‘k1‘: 1, ‘k2‘: 3}func(111,222,*[1,2,3],k11=‘alex‘,**{‘k1‘:1,‘k2‘:3})#(111, 222, 1, 2, 3) {‘k11‘: ‘alex‘, ‘k1‘: 1, ‘k2‘: 3}
  7. 参数相关重点:

    1. 定义函数

      def func1(a1,a2):    pass ?def func2(a1,a2=None):    pass ?def func3(*args,**kwargs):    pass 
    2. 调用函数

      位置参数 > 关键字参数

4.3 作用域

  1. python中

    • py文件:全局作用域
    • 函数:局部作用域
      a = 1def s1():    x1 = 666    print(x1)   #666    print(a)    #1    print(b)    #2?b = 2print(a)    #1s1()a = 88888def s2():    print(a,b)  #88888,2    s1()    #666,88888,2?s2()
  2. 一个函数是一个作用域

       def func():       x = 9       print(x)    #9   func()   print(x)    #9
  3. 作用域中查找数据规则:

    • 优先在自己的作用域找数据,自己没有就去 "父级" -> "父级" -> 直到全局,全部么有就报错。注意:父级作用域中的值到底是什么?

      # 示例一
      x = 10
      def func():
          x = 9
          print(x)    #9
      ?
      func()
      ?
      # 练习题
      x = 10
      def func():
          x = 9
          print(x)    #9
          def x1():
              x = 999
              print(x)    # 999
      ?
      func()
      ?
      x = 10
      def func():
          x = 9
          print(x)    # 9
          def x1():
              x = 999
              print(x)    # 999
          print(x)    # 9
          x1()
      ?
      func()

  4. 子作用域中只能 找到父级中的值 ,默认无法重新为父级的变量进行赋值,但可以修改。(global/nonlocal可以强制做)

    • global :对全局的变量进行赋值
    • nonloca : 找到上一级的局部变量进行赋值

    # 示例一
    name = ‘oldboy‘
    def func():
        name = ‘alex‘ # 在自己作用域再创建一个这样的值。
        print(name)# alex
    func()
    print(name)# oldboy
    ?
    # 示例二
    name = [1,2,43]
    def func():
        name.append(999)
        print(name) # [1, 2, 43, 999]
    func()
    print(name) #[1, 2, 43, 999]
    ?
    # 示例三
    name = ["老男孩",‘alex‘]
    def func():
        global name
        name = ‘我‘
        print(name) # 我
    func()
    print(name) # 我
    ?
    # 示例四
    name = "老男孩"
    def func():
        name = ‘alex‘
        def inner():
            global name
            name = 999
        inner()
        print(name) # alex
    func()
    print(name) # 999
    ?
    ?
    ?
    # 示例五
    name = "老男孩"
    def func():
        name = ‘alex‘
        def inner():
            nonlocal name #
            name = 999
        inner()
        print(name) # 999
    func()
    print(name) # 老男孩

  5. 总结

    • 参数

      • 调用(执行)函数时,传参:位置参数 > 关键字参数
      • 定义函数:
        • def func(a)
        • def func(a,b=None) # 对于默认值,如果是可变类型,----> 坑。
        • def func(*args,**kwargs)
    • 作用域
      • 函数为作用域
      • 自己 > 父级 > 父级 > 全局 【读/修改(可变)】
      • 重新赋值:
        • global
        • nonlocal
    • 全部变量以后必须全部是大写
      USER_LIST = [11,22,3]?def func():    name = ‘asdf‘    USER_LIST.append(12)    USER_LIST.append(name)?func()print(USER_LIST)

原文地址:https://www.cnblogs.com/dpsy921/p/11180080.html

时间: 2024-10-09 20:23:46

第四章 函数之参数、作用域的相关文章

You Don't Know JS: Scope & Closures (第3章: 函数 vs 块作用域)

第二章,作用域由一系列的bubbles组成.每一个都代表了一个container或bucket,装着被声明的identifiers(variables, functions).这些bubbles相互嵌套.这种嵌套是在开发阶段写完的. 什么制造了一个新的bubble? 只是函数吗?其他的JS结构可以创建bubbles of scope吗? Function Vs. Block Scope Scope From Functions 探索函数作用域和它的暗示implications. 函数作用域内的所

第四章,变量,作用域和内存问题

本章内容: 理解基本类型与引用类型的值 理解执行环境 理解垃圾搜集 1.基本类型 基本类型有五种:undefined,null,boolean,string,number 基本类型的赋值方式是拷贝副本,进行赋值,如下图所示:num1值改变了,不影响num2 2.引用类型 引用类型赋值如下,一个对象值的变化,会影响其他的值:  3.传递参数 ECMAScript中所有的函数的参数都是按值传递的.参数如果是值类型,则直接拷贝赋值,如果是引用类型,则赋值其引用地址给参数. 4.执行环境及作用域 变量的

Javascript模式(第四章函数)------读书笔记

一 背景 js函数的两个特点:1 函数是第一类对象(first-class object):2 函数可以提供作用域 1 函数是对象: 1 函数可以在运行时动态创建,还可以在程序执行过程中创建 2 可以被赋值给变量,还可以被删除 3 可以作为参数传递给别的函数,可以作为返回值,被别的函数返回, 4 可以拥有自己的属性和方法 2 由于JS没有块级作用域的概念,因此在涉及到控制变量作用域的时候,函数是必不可少的工具 1.1 消除术语歧义:我们来看一下命名函数表达式.你们函数表达式以及函数声明的定义 1

第四章=》变量、作用域、内存问题

4.1 基本类型和引用类型的值 再将一个值赋给变量时,解析器必须确定这个值是基本类型值还是引用类型值. 基本数据类型:undefined.null.Boolean.Number和String.这5种基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值. 引用类型的值是保存在内存中的对象.JS不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间.在操作对象时,实际上是在操作对象的引用而不是实际的对象.为此,引用类型的只是按引用访问的. 4.1.1 动态的属性 对于引用类型的值,我

《JavaScript 高级程序设计》第四章:变量、作用域和内存问题

目录 变量的引用 执行环境及作用域 作用域链延长 块级作用域 垃圾回收机制 变量的引用 当一个变量保存了基本数据类型时,此时对于变量的操作(赋值,运算)就是操作这个基本数据的本身,就算是赋值操作,赋值时拷贝后的值与之前的值也是相互独立互不影响的. var a = 1; var b = a b++; console.log(a); //1 console.log(b); //2 这非常好理解,但是如果一个变量保存的是一个引用类型的数据,例如对象,那么情况将会不同,这是因为变量保存的并不是对象本身,

python 第四章 函数

函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这被叫做用户自定义函数. 定义一个函数 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数. 函数的第一行语句可以选择性地使用文档字符串-用于存放函数说明

第四章 函数之基本结构

4.1 基本结构 本质: 将多行代码拿到别处并起个名字,以后通过名字就可以找到这行代码并执行 应用场景: 代码重复执行 代码量很多超过一屏,可以选择通过函数进行代码的分割 写代码方式:面向过程----函数式编程(多)----面向对象编程 基本结构 # 函数的定义def 函数名(): 函数内容 pass# 函数的执行函数名() # 示例一 def list_data(): v = [11,54,52] print(v[1]) list_data() # 54 函数如果不被调用,则内部永远不会被执行

JAVA-初步认识-第四章-函数-两个明确-练习2

一. 在对函数的练习中,将之前所做过的所有小程序都用函数功能化一遍.除了练习了函数的书写,还回顾了一些特定代码的书写. 注解:跳出本例来看,像这种没有返回值的功能是否可以说,没有参数加入.→不对,之前输出矩形符号的例子里就有参数的加入. 注解:学习到这里,对于前面的许多知识点理解不够深入,很多细节也已经忘记. 注解:左右两侧不一样.

JAVA-初步认识-第四章-函数-两个明确-练习

一. 加强对函数使用的认识 观察下面截图中的三个需求,可以看出,之前对于功能化的理解还是过于肤浅.方法或函数的核心在于提高复用性,事物重复出现时,我们就将其独立地封装起来,需要时,直接调用.至于这个封装的东西是什么,根本不在乎. 二. 对函数在实际中的应用进行解析 注解:对于本题,两个明确都没搞懂.明确1是确定功能的结果,就是结果的类型,是数值类型还是没类型void.功能是画矩形,那就不是数值,是void.明确二说的是在实现功能的过程中,加入的参数问题. 注解:这里的else居然可以省略,还有返