Python高级 — 函数

1.python常见的列表推导式?

        [表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]

2.简述readreadlinereadlines的区别?     

        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个原则

  1. 函数设计要尽量短小
  2. 函数声明要做到合理、简单、易于使用
  3. 函数参数设计应该考虑向下兼容
  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.Pythonpass语句的作用是什么?

        在编写代码时只写框架思路,具体实现还未编写就可以用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 声明函 数的标准步骤
  1. lambda函数比较轻便,即用即扔,很适合需要完成一项功能,但是此功能只在此一处使用,连名字都很随意的情况下 ;
  2. 匿名函数,一般用来给fifiltermap这样的函数式编程服务 ;
  3. 作为回调函数,传递给某些应用,比如消息处理。

21.递归函数停止的条件

        递归的终止条件一般定义在递归函数内部,在递归调用前要做一个条件判断,根据判断的结果选择是继续调用自身,还是return ,返回终止递归。
        终止的条件:
  1. 判断递归的次数是否达到某一限定值 ;
  2. 判断运算的结果是否达到某个范围等,根据设计的目的来选择。

22.Python中append和extend的区别

Python中append和extend的区别https://www.cnblogs.com/subic/p/6553187.html        append命令是将整个对象加在列表末尾;而extend命令是将新对象中的元素逐一加在列表的末尾。总的来说,append命令可以添加单个元素,也可以添加可迭代对象;而extend命令只能添加可迭代对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值