Python常见面试题

本文详细讲解Python中*args和**kwargs的用法区别,演示如何实现时间计时器装饰器,并介绍Python数据类型及其深浅拷贝。深入理解字符串、布尔型、列表、元组、字典和集合,以及它们在实际编程中的应用。
摘要由CSDN通过智能技术生成

常见面试题

1.Python中*args和**kwargs的区别

详细参见: 添加链接描述
当我们不知道向函数传递多少参数时,比如我们向传递一个列表或元组,我们就使用*args。
在我们不知道该传递多少关键字参数时,使用kwargs来收集关键字参数。
一、*args的使用方法
*args 用来将参数
打包成tuple**给函数体调用
二、**kwargs的使用方法
**kwargs 打包关键字参数成dict给函数体调用

注意点:参数arg、args、kwargs三个参数的位置必须是一定的*。必须是(arg,*args,kwargs)这个顺序,否则程序会报错
python 中 *args 和 **kwargs 的区别
三、在 python 中,*args 和 kwargs 都代表 1个 或 多个 参数的意思。*args 传入tuple 类型
的无名参数,而 **kwargs 传入的参数是 dict 类型。
在不知道传入多少个参数时,args是一个数组,kwargs一个字典。

2.深拷贝浅拷贝

重点参考
其次参考
1.深浅拷贝在python中经常使用,其区别的外在表现是:
使用浅拷贝,当原容器对象中可变对象中有元素发生变化,拷贝得到的对象也会变化。而使用深拷贝时,不会有这种问题。
2.浅拷贝
copy模块里面的copy方法实现
1)对于 不可变类型 Number String Tuple,浅复制仅仅是地址指向不会开辟新空间
2)对于 可 变类型 List、Dictionary、Set,浅复制会开辟新的空间地址(仅仅是最顶层开辟了新的空间,里层的元素地址还是一样的),进行浅拷贝
3)浅拷贝后,改变原始对象中为可变类型的元素的值会同时影响拷贝对象的;改变原始对象中为不可变类型的元素的值只有原始类型受影响。(操作拷贝对象对原始对象的也是同理)
深拷贝
3.copy模块里面的deepcopy方法实现
1)浅拷贝,除了顶层拷贝,还对子元素也进行了拷贝(本质上递归浅拷贝)
2)经过深拷贝后,原始对象和拷贝对象所有的元素地址都没有相同的了
转载链接:添加链接描述
4.什么是可变对象,什么是不可变对象:
可变对象是指,一个对象在不改变其所指向的地址的前提下可以修改其所指向的地址中的值
不可变对象是指,一个对象所指向的地址上值是不能修改的,如果你修改了这个对象的值,那么它指向的地址就改变了,相当于你把这个对象指向的值复制出来一份,然后做了修改后存到另一个地址上了,但是可变对象就不会做这样的动作,而是直接在对象所指的地址上把值给改变了,而这个对象依然指向这个地址。

3.python装饰器-写个时间计时器

装饰器参考链接
python time模块和datetime模块详解

import time

def count_time(func):
    def int_time(*args, **kwargs):
        start_time = time.time()  # 程序开始时间
        func()
        over_time = time.time()   # 程序结束时间
        total_time = over_time - start_time
        print('程序共计%s秒' % total_time)

    return int_time

@count_time
def main():
    print('>>>>开始计算函数运行时间')
    x = 0
    for i in range(1000000):
        x=x//13
    print(x)

if __name__ == '__main__':
    main()
import datetime
def count_time(func):
    def int_time(*args, **kwargs):
        start_time = datetime.datetime.now()  # 程序开始时间
        func()
        over_time = datetime.datetime.now()   # 程序结束时间
        total_time = (over_time-start_time).total_seconds()
        print('程序共计%s秒' % total_time)
    return int_time
@count_time
def main():
    print('>>>>开始计算函数运行时间')
    for i in range(1, 1000):      # 可以是任意函数  , 这里故意模拟函数的运行时间
        for j in range(i):
            print(j)
if __name__ == '__main__':
    main()

4.python数据类型有哪些?

1. 数字类型
Python数字类型主要包括int(整型)、long(长整型)和float(浮点型)、complex(复数),但是在Python3中就不再有long类型了。
int(整型)
在32位机器上,整数的位数是32位,取值范围是-231231-1,即-2147483648214748364;在64位系统上,整数的位数为64位,取值范围为-263263-1,即92233720368547758089223372036854775807。
long(长整型)
Python长整型没有指定位宽,但是由于机器内存有限,使用长的长整数数值也不可能无限大。
float(浮点型)
浮点型也就是带有小数点的数,其精度和机器有关。
complex(复数)
Python还支持复数,复数由实数部分和虚数部分构成,可以用 a + bj,或者 complex(a,b) 表示, 复数的实部 a 和虚部 b 都是浮点型。
2. 字符串
在Python中,加了引号的字符都被认为是字符串,其声明有三种方式,分别是:单引号、双引号和三引号;Python中的字符串有两种数据类型,分别是str类型和unicode类型,str类型采用的ASCII编码,无法表示中文,unicode类型采用unicode编码,能够表示任意字符,包括中文和其他语言。
3. 布尔型
和其他编程语言一样,Python布尔类型也是用于逻辑运算,有两个值:True(真)和False(假)
4. 列表
列表是Python中使用最频繁的数据类型,集合中可以放任何数据类型,可对集合进行创建、查找、切片、增加、修改、删除、循环和排序操作。
5. 元组
元组和列表一样,也是一种序列,与列表不同的是,元组是不可修改的,元组用**”()”标识**,内部元素用逗号隔开
6. 字典
字典是一种键值对的集合,是除列表以外Python之中最灵活的内置数据结构类型,列表是有序的对象集合字典是无序的对象集合
7. 集合
集合是一个无序的、不重复的数据组合,它的主要作用有两个,分别是去重和关系测试
原文链接:添加链接描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值