1.python常见的列表推导式?
[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]
2.简述read、readline、readlines的区别?
read:读取整个文件
readline:读取下一行
readlines:读取整个文件到一个迭代器以供我们遍历
3.python函数重载机制
函数重载主要是为了解决两个问题。
- 可变参数类型。
- 可变参数个数。
另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同
的,此时才使用函数重载,如果两个函数的功能其实不同,那么不应当使用重载,而应当使用一个名字
不同的函数。
那么对于情况 1
,函数功能相同,但是参数类型不同,
python
如何处理?答案是根本不需要处
理,因为
python
可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型
python
中
很可能是相同的代码,没有必要做成两个不同函数。
那么对于情况 2
,函数功能相同,但参数个数不同,
python
如何处理?大家知道,答案就是缺省参
数。对那些缺少的参数设定为缺省参数即可解决问题。因为你假设函数功能相同,那么那些缺少的参数
终归是需要用的。
鉴于情况 1
跟 情况
2
都有了解决方案,
python 自然就不需要函数重载了
。
4.写一个函数,找出一个整数数组中第二大的数
设置两个标志位一个存储最大数,一个存储次大数。 two
存储次大值,
one
存储最大值,遍历一次数组即可,先判断是否大于
one
,若大于将
one
的值给
two
,将
num_list[i]
的值给
one
,否则比较是否大于
two
,若大于直接将
num_list[i]
的值给
two
,否则
pass
。
def find_second_large_num(num_list):
one = num_list[0]
two = num_list[0]
for i in range(1, len(num_list)):
if num_list[i] > one:
two = one
one = num_list[i]
elif num_list[i] > two:
two = num_list[i]
print("第二个大的数是 :", two)
num_list = [34, 11, 23, 56, 78, 0, 9, 12, 3, 7, 5]
find_second_large_num(num_list)
5.手写一个判断时间的装饰器
import datetime
class TimeException(Exception):
def __init__(self, exception_info):
super().__init__()
self.info = exception_info
def __str__(self):
return self.info
def timecheck(func):
def wrapper(*args, **kwargs):
if datetime.datetime.now().year == 2021:
func(*args, **kwargs)
else:
raise TimeException("函数已过时")
return wrapper
@timecheck
def test(name):
print("Hello {}, 2021 Happy".format(name))
if __name__ == "__main__":
test("backbp")
6.使用Python内置的fifilter()方法来过滤
list(filter(lambda x: x % 2 == 0, range(10)))
7.编写函数的4个原则
- 函数设计要尽量短小
- 函数声明要做到合理、简单、易于使用
- 函数参数设计应该考虑向下兼容
- 一个函数只做一件事情,尽量保证函数语句粒度的一致性
8.函数调用参数的传递方式
Python的参数传递有:位置参数、默认参数、可变参数、关键字参数。
函数的传值到底是值传递还是引用传递、要分情况:
不可变参数用值传递:像整数和字符串这样的不可变对象,是通过拷贝进行传递的,因为你无论如何都不可能在原处改变不可变对象。
可变参数是引用传递:比如像列表,字典这样的对象是通过引用传递、和C
语言里面的用指针传递数组很相似,可变对象能在函数内部改变。
9.如何在function里面设置一个全局变量
globals() # 返回包含当前作用域全局变量的字典。
global 变量 设置使用全局变量
10.对缺省参数的理解
缺省参数指在调用函数的时候没有传入参数的情况下,调用默认的参数,在调用函数的同时赋值时,所传入的参数会替代默认参数。
*args是不定长参数,它可以表示输入参数是不确定的,可以是任意多个。
**kwargs是关键字参数,赋值的时候是以键值对的方式,参数可以是任意多对在定义函数的时候
不确定会有多少参数会传入时,就可以使用两个参数 。
11.带参数的装饰器
带定长参数的装饰器
def new_func(func):
def wrappedfun(username, passwd):
if username == 'root' and passwd == '123456789':
print('通过认证')
print('开始执行附加功能')
return func()
else:
print('用户名或密码错误')
return
return wrappedfun
@new_func
def origin():
print('开始执行函数')
origin('root','123456789')
带不定长参数的装饰器
def new_func(func):
def wrappedfun(*parts):
if parts:
counts = len(parts)
print('本系统包含 ', end='')
for part in parts:
print(part, ' ',end='')
print('等', counts, '部分')
return func()
else:
print('用户名或密码错误')
return func()
return wrappedfun
@new_func
def origin():
print('开始执行函数')
origin('root','123456789')
12.为什么函数名字可以当做参数用?
Python中一切皆对象,函数名是函数在内存中的空间,也是一个对象。
13.Python中pass语句的作用是什么?
在编写代码时只写框架思路,具体实现还未编写就可以用pass
进行占位,是程序不报错,不会进行任何操作。
14.map函数和reduce函数
map(lambda x: x * x, [1, 2, 3, 4]) # 使用 lambda
# [1, 4, 9, 16]
reduce(lambda x, y: x * y, [1, 2, 3, 4]) # 相当于 ((1 * 2) * 3) * 4
# 24
15.回调函数是如何通信的?
回调函数是把函数的指针(
地址
)
作为参数传递给另一个函数,将整个函数当作一个对象,赋值给调用的函数。
16.Python主要的内置数据类型都有哪些?
布尔类型,数字,字符串,列表,元组,字典,集合
17.print dir( ‘a ’) 的输出?
输出字符串'a'
的内建方法
print(dir('a'))
# 输出字符串 a 的内建方法
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
18.hasattr() getattr() setattr() 函数使用详解
hasattr(object,name)函数
:
判断一个对象里面是否有name
属性或者
name
方法,返回
bool
值,有
name
属性(方法)返回
True
,否
则返回
False
。
class function_demo(object):
name = 'demo'
def run(self):
return "hello function"
functiondemo = function_demo()
res = hasattr(functiondemo, "name") # 判断对象是否有name属性,True
res = hasattr(functiondemo, "run") # 判断对象是否有run方法,True
res = hasattr(functiondemo, "age") # 判断对象是否有age属性,False
getattr(object, name[,default])函数:
获取对象object
的属性或者方法,如果存在则打印出来,如果不存在,打印默认值,默认值可选。注意:如果返回的是对象的方法,则打印结果是:方法的内存地址,如果需要运行这个方法,可以在后面
添加括号
()。
functiondemo = function_demo()
getattr(functiondemo, "name")# 获取name属性,存在就打印出来 --- demo
getattr(functiondemo, "run") # 获取run 方法,存在打印出方法的内存地址
getattr(functiondemo, "age") # 获取不存在的属性,报错
getattr(functiondemo, "age", 18)# 获取不存在的属性,返回一个默认值
setattr(object, name, values)函数:
给对象的属性赋值,若属性不存在,先创建再赋值 。
class function_demo(object):
name = "demo"
def run(self):
return "hello function"
functiondemo = function_demo()
res = hasattr(functiondemo, "age") # 判断age属性是否存在,False
print(res)
setattr(functiondemo, "age", 18) # 对age属性进行赋值,无返回值
res1 = hasattr(functiondemo, "age") # 再次判断属性是否存在,True
print(res1)
综合使用
class function_demo(object):
name = "demo"
def run(self):
return "hello function"
functiondemo = function_demo()
res = hasattr(functiondemo, "addr") # 先判断是否存在
if res:
addr = getattr(functiondemo, "addr")
print(addr)
else:
addr = getattr(functiondemo, "addr", setattr(functiondemo, "addr", "北京首都"))
print(addr)
19.一行代码解决阶乘函数
from functools import reduce
n = 10
reduce(lambda x,y : x*y,range(1,n+1))
20.什么是lambda函数? 有什么好处?
lambda 函数,
匿名函数
,是一个可以接收任意多个参数
(
包括可选参数
)并且返回单个表达式值的函数,
省略了用
def
声明函
数的标准步骤
。
- lambda函数比较轻便,即用即扔,很适合需要完成一项功能,但是此功能只在此一处使用,连名字都很随意的情况下 ;
- 匿名函数,一般用来给fifilter,map这样的函数式编程服务 ;
- 作为回调函数,传递给某些应用,比如消息处理。
21.递归函数停止的条件
递归的终止条件一般定义在递归函数内部,在递归调用前要做一个条件判断,根据判断的结果选择是继续调用自身,还是return
,返回终止递归。
终止的条件:
- 判断递归的次数是否达到某一限定值 ;
- 判断运算的结果是否达到某个范围等,根据设计的目的来选择。
22.Python中append和extend的区别
Python中append和extend的区别https://www.cnblogs.com/subic/p/6553187.html append命令是将整个对象加在列表末尾;而extend命令是将新对象中的元素逐一加在列表的末尾。总的来说,append命令可以添加单个元素,也可以添加可迭代对象;而extend命令只能添加可迭代对象。