文章目录

  • 写在前面
  • 21、def func(a,b=[]) 这种写法有什么坑
  • 22、(1)和(1,)的区别
  • 23、在函数中声明全局变量
  • 24、栈(stack)和队列(queue)的区别
  • 25、常用字符串格式化哪几种
  • 26、谈谈你对闭包的理解
  • 27、闭包中内函数修改外函数局部变量
  • 28、函数加()和不加的区别
  • 29、装饰器的作用及应用
  • 30、实例方法、类方法、静态方法的区别与作用
  • 31、os和sys模块
  • 32、简述 yield和yield from
  • 33、断言(assert)及应用场景
  • 34、raise显示异常
  • 35、logging模块

写在前面

21、def func(a,b=[]) 这种写法有什么坑

函数的默认参数是一个list 当第一次执行的时候实例化了一个list,第二次执行还是用第一次执行的时候实例化的地址存储

python第一章习题解答 python一二章题库及答案_类方法

22、(1)和(1,)的区别

前者括号是运算符,后则是元组

23、在函数中声明全局变量

使用 global

24、栈(stack)和队列(queue)的区别

python第一章习题解答 python一二章题库及答案_静态方法_02

25、常用字符串格式化哪几种

字符串格式化有两种方式:百分号方式、format方式。

python第一章习题解答 python一二章题库及答案_实例方法_03


python第一章习题解答 python一二章题库及答案_类方法_04

26、谈谈你对闭包的理解

在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。

python第一章习题解答 python一二章题库及答案_静态方法_05

闭包有啥用??!!
1装饰器!!!装饰器是做什么的??其中一个应用就是,我们工作中写了一个登录功能,我们想统计这个功能执行花了多长时间,我们可以用装饰器装饰这个登录模块,装饰器帮我们完成登录函数执行之前和之后取时间。
2面向对象!!!经历了上面的分析,我们发现外函数的临时变量送给了内函数。大家回想一下类对象的情况,对象有好多类似的属性和方法,所以我们创建类,用类创建出来的对象都具有相同的属性方法。闭包也是实现面向对象的方法之一。在python当中虽然我们不这样用,在其他编程语言入比如javaScript中,经常用闭包来实现面向对象编程 3实现单利模式!!

27、闭包中内函数修改外函数局部变量

1 在python3中,可以用nonlocal 关键字声明 一个变量, 表示这个变量不是局部变量空间的变量,需要向上一层变量空间找这个变量。

2 在python2中,没有nonlocal这个关键字,我们可以把闭包变量改成可变类型数据进行修改,比如列表。

    

python第一章习题解答 python一二章题库及答案_类方法_06

28、函数加()和不加的区别

,如果函数名后紧跟一对括号,相当于现在我就要调用这个函数,如果不跟括号,相当于只是一个函数的名字,里面存了函数所在位置的引用。

29、装饰器的作用及应用

装饰器:增强函数或类的功能的一个函数,可以减少代码重复
应用场景:注册登录、插入日志,性能测试,事务处理,缓存等等场景,另外静态方法和类方法也是使用装饰器实现的。
不使用@

def makeitalic(fun):#makitalic传了一个新函数
    def wrapped():#内部函数
        return "<i>"+fun()+"</i>"#要加的新功能
    return wrapped#返回的是wrapped函数功能

def hello():#对这个功能进行增强
    return "hello world!"


#makeitalic里面传入了hello函数,然后内部函数fun()函数也就相当于hello函数了
hello_2=makeitalic(hello)

#打印新函数,返回的就是<i>hello world!</i>
print(hello_2())

使用@

def makeitalic(fun):
    def wrapped():
        return "<i>" + fun() + "</i>"
    return wrapped

@makeitalic#使用了装饰器可以直接调用,不需要赋值了
def hello():
    return "hello world"
print(hello())#使用了装饰器可以直接调用,不需要赋值了

30、实例方法、类方法、静态方法的区别与作用

实例方法

定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法);

调用:只能由实例对象调用。

类方法

定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);

调用:类对象或实例对象都可以调用。

静态方法

定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法;

调用:类对象或实例对象都可以调用。
class Myclass:
    # 定义一个静态变量,可以被静态方法和类方法访问
    name = 'Bill'
    def __init__(self):
        print('Myclass的构造方法被调用')
        # 定义实例变量,静态方法和类方法不能访问该变量
        self.value = 20
    # 定义静态方法
    @staticmethod
    def run():
        # 访问Myclass类中的静态变量name
        print('*', Myclass.name, '*')
        print('Myclass的静态方法run被调用')

    # 定义类方法
    @classmethod
    # 这里self是类的元数据,不是类的实例
    def do(self):
        print(self)
        # 访问Myclass类中的静态变量name
        print('[', self.name, ']')
        print('调用静态方法run')
        self.run()
        # 在类方法中不能访问实例变量,否则会抛出异常(因为实例变量需要用类的实例访问) print(self.value)
        print('成员方法do被调用')
    # 定义实例方法
    def do1(self):
        print(self.value)
        print('<', self.name, '>')
        print(self)
# 调用静态方法run
Myclass.run()
# 创建Myclass类的实例
c = Myclass()
# 通过类的实例也可以调用类方法
c.do()
# 通过类访问类的静态变量
print('Myclass2.name', '=', Myclass.name)
# 通过类调用类方法
Myclass.do()
# 通过类的实例访问实例方法
c.do1()

为什么要使用静态方法:静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互。类名对于静态方法来说更像是一种命名空间,其实也可以在类外面写一个同样的方法,但是这样做难以维护代码。

为什么使用类方法:只使用类中的静态变量,类方法可以继承、静态方法则不能继承

31、os和sys模块

os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;
sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。

32、简述 yield和yield from

yield:生成器的返回值关键字,相当于return返回一个值,并且记住这个返回的位置.下一次迭代就从这个位置开始。

yield from:生成器中使用生成器

python第一章习题解答 python一二章题库及答案_类方法_07

33、断言(assert)及应用场景

断言:assert语句用于检测某个条件表达式是否为真,否则抛出异常。

那什么时候应该使用assert?没有特定的规则,断言应该用于:
☆防御型的编程
☆运行时检查程序逻辑
☆检查约定
☆程序常量
☆检查文档

34、raise显示异常

raise用于显示地引发异常。一旦执行了raise语句,raise后面的语句将不能执行。

例:

def functionName( level ):
    if level < 1:
        raise Exception("Invalid level!", level)
        # 触发异常后,后面的代码就不会再执行

35、logging模块

logging模块定义的函数和类为应用程序和库的开发实现了一个灵活的事件日志系统。logging模块是Python的一个标准库模块