好的网站优化公司,阳江营销型网站建设,营销网站优化推广,私密浏览器看片Python global 语句的作用lambda 匿名函数好处Python 错误处理Python 内置错误类型简述 any() 和 all() 方法Python 中什么元素为假#xff1f;提高 Python 运行效率的方法Python 单例模式为什么 Python 不提供函数重载实例方法/静态方法/类方法__new__和 __init __方法的区别…Python global 语句的作用lambda 匿名函数好处Python 错误处理Python 内置错误类型简述 any() 和 all() 方法Python 中什么元素为假提高 Python 运行效率的方法Python 单例模式为什么 Python 不提供函数重载实例方法/静态方法/类方法__new__和 __init __方法的区别Python 的函数参数传递Python 实现对函参做类型检查为什么说 Python 是动态语言Python 装饰器理解map 与 reduce 函数用法解释Python 深拷贝、浅拷贝区别Python 继承多态理解Python 面向对象的原则参考资料
Python global 语句的作用
在编写程序的时候如果想要**改变(重新赋值)**函数外部的变量并且这个变量会作用于许多函数中就需要告诉 Python 程序这个变量的作用域是全局变量global 语句可以实现定义全局变量的作用。
lambda 匿名函数好处
精简代码lambda省去了定义函数map 省去了写 for 循环过程:
str_1 [中国, 美国, 法国, , , 英国]
res list(map(lambda x: 填充值 if x else x, str_1))
print(res) # [中国, 美国, 法国, 填充值, 填充值, 英国]Python 错误处理
和其他高级语言一样Python 也内置了一套try...except...finally... 的错误处理机制。
当我们认为某些代码可能会出错时就可以用 try 来运行这段代码如果执行出错则后续代码不会继续执行而是直接跳转至跳转至错误处理代码即 except 语句块执行完 except 后如果有 finally 语句块则执行。至此执行完毕。跳转至错误处理代码
Python 内置错误类型
IOError输入输出异常AttributeError试图访问一个对象没有的属性ImportError无法引入模块或包基本是路径问题IndentationError语法错误代码没有正确的对齐IndexError下标索引超出序列边界KeyError: 试图访问你字典里不存在的键SyntaxError: Python 代码逻辑语法出错不能执行NameError: 使用一个还未赋予对象的变量
简述 any() 和 all() 方法
any(): 只要迭代器中有一个元素为真就为真;all(): 迭代器中所有的判断项返回都是真结果才为真.
Python 中什么元素为假
答案0空字符串空列表、空字典、空元组、None, False
提高 Python 运行效率的方法
使用生成器因为可以节约大量内存;循环代码优化避免过多重复代码的执行;核心模块用 Cython PyPy 等提高效率;多进程、多线程、协程;多个 if elif 条件判断可以把最有可能先发生的条件放到前面写这样可以减少程序判断的次数提高效率。
Python 单例模式
为什么 Python 不提供函数重载 参考知乎为什么 Python 不支持函数重载其他函数大部分都支持的 我们知道 函数重载 主要是为了解决两个问题。
可变参数类型。可变参数个数。
另外一个函数重载基本的设计原则是仅仅当两个函数除了参数类型和参数个数不同以外其功能是完全相同的此时才使用函数重载如果两个函数的功能其实不同那么不应当使用重载而应当使用一个名字不同的函数。
对于情况 1 函数功能相同但是参数类型不同Python 如何处理答案是根本不需要处理因为 Python 可以接受任何类型的参数如果函数的功能相同那么不同的参数类型在 Python 中很可能是相同的代码没有必要做成两个不同函数。对于情况 2 函数功能相同但参数个数不同Python 如何处理大家知道答案就是缺省参数(默认参数)。对那些缺少的参数设定为缺省参数(默认参数)即可解决问题。因为你假设函数功能相同那么那些缺少的参数终归是需要用的。所以鉴于情况 1 跟 情况 2 都有了解决方案Python 自然就不需要函数重载了。
实例方法/静态方法/类方法
Python 类语法中有三种方法实例方法静态方法类方法它们的区别如下
实例方法只能被实例对象调用静态方法(由 staticmethod 装饰器来声明)、类方法(由 classmethod 装饰器来声明)可以被类或类的实例对象调用;实例方法第一个参数必须要默认传实例对象一般习惯用self。静态方法参数没有要求。类方法第一个参数必须要默认传类一般习惯用 cls .
实例代码如下
class Foo(object):类三种方法语法形式def instance_method(self):print(是类{}的实例方法只能被实例对象调用.format(Foo))staticmethoddef static_method():print(是静态方法)classmethoddef class_method(cls):print(是类方法)foo Foo()
foo.instance_method()
foo.static_method()
foo.class_method()
print(##############)
Foo.static_method()
Foo.class_method()程序执行后输出如下 是类 class ‘main.Foo’ 的实例方法只能被实例对象调用 是静态方法 是类方法 ############## 是静态方法 是类方法 __new__和 __init __方法的区别
__init__ 方法并不是真正意义上的构造函数, __new__ 方法才是(类的构造函数是类的一种特殊的成员函数它会在每次创建类的新对象时执行);__new__ 方法用于创建对象并返回对象当返回对象时会自动调用 __init__ 方法进行初始化, __new__ 方法比 __init__ 方法更早执行;__new__ 方法是静态方法而 __init__ 是实例方法。
Python 的函数参数传递 参考这两个链接stackoverflow的最高赞那个讲得很详细 How do I pass a variable by reference? Python 面试题 个人总结有点不好
将可变对象列表list、字典dict、NumPy数组ndarray和用户定义的类型类作为参数传递给函数函数内部将其改变后函数外部这个变量也会改变对变量进行重新赋值除外 rebind the reference in the method将不可变对象字符串string、元组tuple、数值numbers作为参数传递给函数函数内部将其改变后函数外部这个变量不会改变
Python 实现对函参做类型检查
Python 自带的函数一般都会有对函数参数类型做检查自定义的函数参数类型检查可以用函数 isinstance() 实现例如
def my_abs(x):自定义的绝对值函数:param x: int or float:return: positive number, int or floatif not isinstance(x, (int, float)):raise TypeError(bad operand type)if x 0:return xelse:return -x添加了参数检查后如果传入错误的参数类型函数就可以抛出一个 TypeError 错误。
为什么说 Python 是动态语言
在 Python 中等号 是赋值语句可以把任意数据类型赋值给变量同样一个变量可以反复赋值而且可以是不同类型的变量例如
a 100 # a是int型变量
print(a)
a ABC # a 是str型变量
print(a)Pyhon 这种变量本身类型不固定可以反复赋值不同类型的变量称为动态语言与之对应的是静态语言。静态语言在定义变量时必须指定变量类型如果赋值的时候类型不匹配就会报错Java/C 都是静态语言int a; a 100
Python 装饰器理解
装饰器本质上是一个 Python 函数或类它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能装饰器的返回值也是一个函数/类对象。它经常用于有切面需求的场景比如插入日志、性能测试、事务处理、缓存、权限校验等场景装饰器是解决这类问题的绝佳设计。有了装饰器我们就可以抽离出大量与函数功能本身无关的雷同代码到装饰器中并继续重用。概括的讲装饰器的作用就是为已经存在的对象添加额外的功能。
map 与 reduce 函数用法解释
1、map() 函数接收两个参数一个是函数一个是 Iterablemap 将传入的函数依次作用到序列的每个元素并将结果作为新的 Iterator 返回简单示例代码如下
# 示例
def square(x):return x ** 2
r map(square, [1, 2, 3, 4, 5, 6, 7])
squareed_list list(r)
print(squareed_list) # [1, 4, 9, 16, 25, 36, 49]
# 使用lambda匿名函数简化为一行代码
list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
# 示例
list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])) [1, 2, 3, 4, 5, 6, 7, 8, 9]注意map函数返回的是一个Iterator惰性序列要通过list函数转化为常用列表结构。map()作为高阶函数事实上它是把运算规则抽象了。
2、reduce() 函数也接受两个参数一个是函数两个参数一个是序列与 map 不同的是reduce 把结果继续和序列的下一个元素做累积计算,效果如下 reduce(f, [x1, x2, x3, x4]) f(f(f(x1, x2), x3), x4)
示例代码如下
from functools import reduce
CHAR_TO_INT {0: 0,1: 1,2: 2,3: 3,4: 4,5: 5,6: 6,7: 7,8: 8,9: 9
}
def str2int(str):ints map(lambda x:CHAR_TO_INT[x], str) # str对象是Iterable对象return reduce(lambda x,y:10*x y, ints)
print(str2int(0))
print(str2int(12300))
print(str2int(0012345)) # 0012345Python 深拷贝、浅拷贝区别 Python 中的大多数对象比如列表 list、字典 dict、集合 set、numpy 数组和用户定义的类型类都是可变的。意味着这些对象或包含的值可以被修改。但也有些对象是不可变的例如数值型 int、字符串型 str 和元组 tuple。 1、复制不可变数据类型
复制不可变数据类型不管 copy 还是 deepcopy, 都是同一个地址。当浅复制的值是不可变对象数值字符串元组时和“赋值”的情况一样对象的 id 值与浅复制原来的值相同。
2、复制可变数据类型
直接赋值其实就是对象的引用别名。浅拷贝(copy)拷贝父对象不会拷贝对象内部的子对象拷贝可以理解为创建内存。产生浅拷贝的操作有以下几种 使用切片 [:] 操作使用工厂函数如 list/dir/set , 工厂函数看上去像函数实质上是类调用时实际上是生成了该类型的一个实例就像工厂生产货物一样.使用copy 模块中的 copy() 函数b a.copy(), a 和 b 是一个独立的对象但他们的子对象还是指向统一对象是引用。 深拷贝(deepcopy) copy 模块的 deepcopy() 方法完全拷贝了父对象及其子对象两者是完全独立的。深拷贝包含对象里面的子对象的拷贝所以原始对象的改变不会造成深拷贝里任何子元素的改变。
**注意浅拷贝和深拷贝的不同仅仅是对组合对象来说所谓的组合对象容器就是包含了其它对象的对象如列表类实例。而对于数字、字符串以及其它“原子”类型没有子对象没有拷贝一说产生的都是原对象的引用。**更清晰易懂的理解可以参考这篇文章。
看一个示例程序就能明白浅拷贝与深拷贝的区别了
#!/usr/bin/Python3
# -*-coding:utf-8 -*-import copy
a [1, 2, 3, [a, b, c]]b a # 赋值传对象的引用
c copy.copy(a) # 浅拷贝
d copy.deepcopy(a) # 深拷贝a.append(4)
a[3].append(d)print(id(a), id(b), id(c), id(d)) # a 与 b 的内存地址相同
print(a , a)
print(b , b)
print(c , c)
print(d , d) # [1, 2, 3, [a, b, c]]程序输出如下 2061915781832 2061915781832 2061932431304 2061932811400 a [1, 2, 3, [‘a’, ‘b’, ‘c’, ‘d’], 4] b [1, 2, 3, [‘a’, ‘b’, ‘c’, ‘d’], 4] c [1, 2, 3, [‘a’, ‘b’, ‘c’, ‘d’]] d [1, 2, 3, [‘a’, ‘b’, ‘c’]] Python 继承多态理解
多态是指对不同类型的变量进行相同的操作它会根据对象或类类型的不同而表现出不同的行为。继承可以拿到父类的所有数据和方法子类可以重写父类的方法也可以新增自己特有的方法。先有继承后有多态不同类的对象对同一消息会作出不同的相应。
Python 面向对象的原则
Python 工匠写好面向对象代码的原则上Python 工匠写好面向对象代码的原则中Python 工匠写好面向对象代码的原则下
参考资料
参考这里110道Python面试题真题关于Python的面试题继承和多态Python 直接赋值、浅拷贝和深度拷贝解析