第二模块:函数编程(学位课程):(第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循环生成器对象时,此时生成器对象没有元素可以获取到 近似理解为循环一个空列表,输出为空,不会抛出异常。
原文地址:https://www.cnblogs.com/foremostxl/p/9860549.html