zoukankan      html  css  js  c++  java
  • 第二模块:函数编程(学位课程):(第1章)函数、装饰器、迭代器、内置方法

    1、(单选题) 在函数定义时某个形参有值,我们称这个参数为()。

    A位置参数
    B关键字参数
    C形参
    D默认参数
    
    
    D: 如果参数有值,我们称该参数为默认参数
    
    关键参数,关键参数是实参,传参用的
    正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可(指定了参数名的参数就叫关键参数),

    但记住一个要求就是,关键参数必须放在位置参数(以位置顺序确定对应关系的参数)之后

    2、请问python中的变量查找作用域的顺序是什么___?

    答案为LEGB

    LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__ locals 是函数内的名字空间,包括局部变量和形参 enclosing 外部嵌套函数的名字空间 globals 全局变量,函数定义所在模块的名字空间 builtins 内置模块的名字空间

    3、递归的概念

    如果一个函数在内部调用自身本身,这个函数就是递归函数。

    递归函数 数据结构为 栈 ----先进后出

    1必须有一个明确的结束条件
    2每次进入更深一层递归时,问题规模相比上次递归都应有所减少
    3递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,
    每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,
    所以,递归调用的次数过多,会导致栈溢出)

    --------------------------------------------------------

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    4、请使用列表生成式将列表li = [1, 2, 3, 4, 5, 6, 7, 8, 9]中大于5的元素乘以2组成新的列表___。 

    li = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    print([item*2 for item in li if item>5])

    5、(单选题) 基于你对eval函数的了解,请从下面四个选项中选出你认为描述不正确的一项是():

    A  eval函数用来执行一个字符串表达式,并返回表达式的值
    B eval函数可以实现字符串、列表和元组的相互转换
    C eval函数可以指定表达式中的参数的作用域
    D eval函数不可以把字典形式的字符串当作参数
    ---------------------------------------

    A和B都是eval函数最基本的用法,C选项考察的是对eval函数中的参数的理解,globals和 locals都可以指定作用域,D选项是很明显的错误。

    6、eval函数表达式参数作用域的理解

    eval(expression[, globals[, locals]])
    
    expression -- 表达式。
    globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
    locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
    
    功能1:可以把list,tuple,dict和string相互转化。
    
    功能2:执行字符串表达式
    
    看例题:
    
    a = 10
    b = 20
    c = 30
    g = {'a': 6, 'b': 8}
    t = {'b':100, 'c': 10}
    print(eval('a+b', g))     这个有设定了全局变量g
    print(eval('a+b+c', g, t)) 这个设定了全局变量g 和局部变量l   b,c从t中取

    ---------------------------------------------------------
    本题考察对eval函数表达式参数作用域的理解,

    第一个位置参数是字符串表达式source,
    第二 个位置参数是全局作用域globals,

    第三个位置参数是局部作用域locals,locals优先于globals,

    第一 次打印没有指定locals,所以a和b的值都从globals中去,故结果为14;

    第二次打印指定了locals,所以 对于b就要从locals中取值,故相加结果为116,所以选D。

    ------------------------------------------------------------------------------------------------------------------------------------------

    7、Python callable() 函数

    callable() 函数用于检查一个对象是否是可调用的。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。
    对于函数, 方法,
    lambda 函式, 类, 以及实现了 __call__ 方法的类实例, 它都返回 True。

    ----------------------------------------

    实现了__call__方法的对象,相当于重载了(),可以实现调用功能。__call__方法的参数就是调用实例时需要的参数。

    对象后面加括号,触发执行。

    obj = Foo() # 执行 __init__  实例初始化自动执行__init__
    obj()       # 执行 __call__
    一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()。
    
    python中所有的东西都被称为对象,对象分为可以被调用和不可以被调用
    可调用对象:许多Python对象都是我们所说的可调用的,即是任何通过函数操作符()来调用的对象
    
    1.例如函数
    函数是对象,可以被调用
    
    def foo(x):
      retuen x
    
    a=foo(3) #a被调用
    print(a)
    callable(foo())
    callable(a)#输出是true,代表foo是可被调用的,注意,这里可不是指a是可以被调用的,因为foo是赋值给a的
    
    2.但是如果是类的话会发生什么情况呢?
    Python给类提供了名为__call__的特别方法,该方法允许程序员创建可调用的对象(实例)。默认情况下,__call__方法是没有实现的,这意味着大多数情况下实例是不可调用的。
    
    class test():
      def method(self):
        return 1
    a = test()
    callable(a)#false,代表实例a是不可被调用
    
    如何解决这一个问题?这里就用到__call__函数
    
    class test():
      def __call__(self):
        return 1
    a = test()
    callable(a)#true,代表实例a是可被调用

    8、(多选题) 基于你对callable方法的理解,以下说法正确的是():

    A  callable方法就是用来检测对象是否可被调用
    B  返回结果是False则代表对象一定不可被调用
    C  callable方法的参数不可以是整数
    D  callable方法的参数可以是类对象、函数、lambda表达式
    
    
    C选项错在callable方法参数可以是整数,只是结果是False

    9、(填空题) round函数的应用跟python的版本有很大关系,请写出round(0.5)这句代码在python2.7中的执行结果____。 

    python2.7中保留值将保留到四舍五入,所以round(0.5)会近似到1.0,而round(-0.5)会近似到-1.0;python3.5比如round(0.5)和round(-0.5)都会保留到0,而round(1.5)会保留到2。

    10、 (多选题) 关于命名空间的内置函数locals和globals,下列说法你觉得错误的是():

    A    locals 和globals都是是只读的
    B    locals 实际上没有返回局部名字空间,返回_x0008_的是一个拷贝
    C    globals 返回的是全局命名空间的拷贝
    D    对globals返回的字典中的值进行修改都会直接影响到全局变量
    
    
    A选项错在globals不是只读的;C选项错在globals返回的就是实际的全局命名空间,所以 对globals返回值进行修改都会影响全局变量;B选项是正确的,所以对locals返回值进行修改 并不会影响局部变量

     11、>>> f = open('file',mode, encoding='utf-8'),看此代码,mode为什么模式的时候,会报错()。

    Amode='r'
    Bmode='w'
    Cmode='a'
    Dmode='rb'
    
    
    二进制模式的时候,不能指定字符编码,故,此题选D

    -----------------------------

    dic = {'k1': 'a', 'k2': 'b', 'k3': 'c'}
    # 枚举
    for index, value in enumerate(dic, start=1):
        print(index,value)

    1 k1
    2 k2
    3 k3

    -----------------------------
    dict
    = {'Google': 'www.google.com', 'Runoob': 'www.runoob.com', 'taobao': 'www.taobao.com'} print(type(dict.items()))
    <class 'dict_items'>
    ------------------------------------
    # 遍历字典列表 # Python 字典(Dictionary) items() 函数以列表返回可遍历的(键, 值) 元组数组。 for key, values in dict.items(): print(key, values)

    Google www.google.com
    Runoob www.runoob.com
    taobao www.taobao.com

    ---------------------------

    dic = {"name":"jin","age":18,"sex":"male"}
    for key in dic:
        print(key)

    name
    age
    sex

    ---------------------------------

    for value in dic.items():
        print(value)

    ('name', 'jin')
    ('age', 18)
    ('sex', 'male')

    ---------------------------------

    for key ,value in dic.items():
        print(key, value)

    name jin
    age 18
    sex male

    -------------------------------------
    for item in dic.items():
        print(item)

    ('name', 'jin')
    ('age', 18)
    ('sex', 'male')

    ------------------------------------

    闭包三要素:
    
          1、嵌套函数 
    
          2、变量的引用
    
          3、返回内部函数

    -----------------------------------------

    四、装饰器

    1、什么是装饰器(decorator)?

    装饰器其实就是一个闭包,把一个函数当作参数然后返回一个替代版函数。

    装饰器有2个特性:
     
     1、可以把被装饰的函数替换成其他函数

      2、可以在加载模块时候立即执行

     12、 (多选题) 请仔细阅读下面这段代码,关于代码的执行结果以下四个选项中你认为描述准确的是():

    g = (i for i in range(5))
    for j in g:
        print(j)
        
    for k in g:
        print(k)
    ----------------------------
    A    这段代码会报错
    B    输出结果就是0到4共五个数字
    C    执行结果是打印两次0到4共十个数字
    D    以上说法都是不正确的
    ---------------------------
    
    for循环是遍历循环,支持迭代器协议,会自动检测生成器的边界,当生成器中的元素被获取 完时会跳出循环,不会抛出异常;

    当再次for循环生成器对象时,此时生成器对象没有元素可以获取到 近似理解为循环一个空列表,输出为空,不会抛出异常。
  • 相关阅读:
    .Net core 上传文件
    Vue--判断用户首次进入页面还是刷新页面?
    博学笃志,切问近思,此八字,是收放心的工夫。 神闲气静,智深勇沉,此八字,是干大事的本领。
    用javascript替换URL中的参数值
    ASP.Net Core SignalR
    Android菜鸡脉脉求助:4年开发经验,深圳不到15K,我该怎么办?
    Android性能优化
    新手避坑指南:Android组件化开发详解
    Android开发,没有跟上跨平台技术发展是你职业规划最大的可悲
    字节跳动面试官:一张图片占据的内存大小是如何计算
  • 原文地址:https://www.cnblogs.com/foremostxl/p/9860549.html
Copyright © 2011-2022 走看看