python 函数练习题

lambda表达式格式以及应用场景?

匿名函数:为了解决那些功能很简单的需求而设计的一句话函数 与内置函数结合
函数名 = lambda 参数 :返回值

#参数可以有多个,用逗号隔开
#匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
#返回值和正常的函数一样可以是任意数据类型

lambda 表达式
temp = lambda x,y:x+y
print(temp(4,10))   # 14

可替代:
def foo(x,y):
    return x+y
print(foo(4,10))    # 14

*arg和**kwarg作用

*args代表位置参数,它会接收任意多个参数并把这些参数作为元祖传递给函数。
**kwargs代表的关键字参数,返回的是字典,位置参数一定要放在关键字前面

Python垃圾回收机制?

引用计数

标记清除

分代回收

列举常见的内置函数

abs()  print(abs(a))  #输出3
返回数字的绝对值

all()     此函数用于判断给定的可迭代参数 iterable 中的所有元素是否都不为 0、都不为False 或者iterable都 为空,如果是返回 True,否则返回 False。
any()     函数用于判断给定的可迭代参数 iterable 是否全部为空对象,如果都为空、都为0、或者都为false,则返回 False,如果不都为空、不都为0、不都为false,则返回 True。

print()
print函数是你学Python接触到的第一个函数,它将对象输出到标准输出流,可将任意多个对象打印出来

isinstance()
可以用 isinstance 函数判断某个对象是否属于某个类的实例,函数的定义

range()
range函数是个工厂方法,用于构造一个从[start, stop) (不包含stop)之间的连续的不可变的整数序列对象,这个序列功能上和列表非常类似,函数定义:

enumerate()
用于枚举可迭代对象,同时还可以得到每次元素的下表索引值,函数定义:

len()

zip()

列表推导式与生成器推导式

print([ i % 2 for i in range(10) ])  # [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
print([ i  for i in range(10) ])     # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print([ 10 % 2])   # [0]
# %是个运算符。

print(( i % 2 for i in range(10) ))
#  <generator object <genexpr> at 0x00000000020CEEB8> 生成器
# 在Python中,有一种自定义迭代器的方式,称为生成器(Generator)。
# 定义生成器的两种方式:
# 1.创建一个generator,只要把一个列表生成式的[]改成(),就创建了一个generator:
# generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,
没有更多的元素时,抛出StopIteration的错误。
# 2.定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,
而是一个generator

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

def func(a,b = []):
    b.append(1)
    print(a,b)

func(a=2)
func(2)
func(2)


'''
    2 [1]
    2 [1, 1]
    2 [1, 1, 1]
    函数的默认参数是一个list 当第一次执行的时候实例化了一个list 
    第二次执行还是用第一次执行的时候实例化的地址存储 
    所以三次执行的结果就是 [1, 1, 1] 想每次执行只输出[1] ,默认参数应该设置为None

如何在函数中设置一个全局变量

x = 2
def func():
    global x
    x = 1
    return x
func()
print(x)  # 1

简述 生成器、迭代器、可迭代对象 以及应用场景?

迭代器
含有__iter__和__next__方法 (包含__next__方法的可迭代对象就是迭代器)


生成器
:包括含有yield这个关键字,生成器也是迭代器,调动next把函数变成迭代器。

应用场景:
range/xrange
    - py2: range(1000000)  ,会立即创建,xrange(1000000)生成器
    - py3:range(10000000)生成器 
    

可迭代对象  列表、字典、元组
 一个类内部实现__iter__方法且返回一个迭代器。

装饰器

装饰器:
能够在不修改原函数代码的基础上,在执行前后进行定制操作,闭包函数的一种应用 不修改被修饰函数的代码


场景:
   - flask路由系统
   - flask before_request
   - csrf
   - django内置认证
   - django缓存
# 手写装饰器;
import functools
def wrapper(func):
   @functools.wraps(func)  #不改变原函数属性
   def inner(*args, **kwargs):
      执行函数前
      return func(*args, **kwargs)
      执行函数后
   return inner
1. 执行wapper函数,并将被装饰的函数当做参数。 wapper(index)
2. 将第一步的返回值,重新赋值给  新index =  wapper(老index)
@wrapper    #index=wrapper(index)
def index(x):
   return x+100

用Python实现一个二分查找的函数。

二分查找算法:简单的说,就是将一个列表先排序好,比如按照从小到大的顺序排列好,当给定一个数据,比如3,查找3在列表中的位置时,可以先找到列表中间的数li[middle]和3进行比较,当它比3小时,那么3一定是在列表的右边,反之,则3在列表的左边,比如它比3小,则下次就可以只比较[middle+1, end]的数,继续使用二分法,将它一分为二,直到找到3这个数返回或者列表全部遍历完成(3不在列表中) 

优点:效率高,时间复杂度为O(logN); 
缺点:数据要是有序的,顺序存储。

li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 
def search(someone, li):
    l = -1
    h = len(li)
 
    while l + 1 != h:
        m = int((l + h) / 2)
        if li[m] < someone:
            l = m
        else:
            h = m
    p = h
    if p >= len(li) or li[p] != someone:
        print("元素不存在")
    else:
        str = "元素索引为%d" % p
        print(str)
 
search(3, li)  # 元素索引为2

谈谈你对闭包的理解?

ef foo():
    m=3
    n=5
    def bar():
        a=4
        return m+n+a
    return bar
  
>>>bar =  foo()
>>>bar()

种内部函数可以使用外部函数变量的行为,就叫闭包。或者有自由变量

是否使用过functools中的函数?其作用是什么?

用于修复装饰器  flask源码里面有用到

import functools
 
def deco(func):
    @functools.wraps(func)  # 加在最内层函数正上方
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
 
    return wrapper
 
 
@deco
def index():
    '''哈哈哈哈'''
    x = 10
    print('from index')
 
 
print(index.__name__)
print(index.__doc__)
 
# 加@functools.wraps
# index
# 哈哈哈哈
 
# 不加@functools.wraps
# wrapper
# None

异常处理写法以及如何主动跑出异常(应用场景)

# 触发异常
def temp_convert(var):
    try:
        return int(var)
    except ValueError as Argument:
        print ("参数没有包含数字%s"%Argument)

# 调用函数
temp_convert("xyz")
# 以10为基数的int()的无效文字:“xyz”

----------------------------------------------------------------------------
# raise语法
#raise [Exception [, args [, traceback]]]
# 语句中 Exception 是异常的类型,args 是自已提供的异常参数。

class Networkerror(RuntimeError):
    def __init__(self, arg):
        self.args = arg
try:
    raise Networkerror("Bad hostname")
except Networkerror as e:
    print(e.args)

yield和yield from关键字

猜你喜欢

转载自www.cnblogs.com/saoqiang/p/12453733.html