面试_python常见问题

面试算法题常用函数

a = input() 读取一行输入
a ,b = map(int,input().split()) 一行输入两个,空格分开
int(str,16), list() 直接转换数据类型,int可以直接把n进制字符转换为数字
ord(a):97 ord(A):65 chr(97):将对应的ASCLL码值转换为对应的字符
sqrt() 开根

迭代

数组,列表,字典,字符串等可迭代。int,单字符不可迭代。
一个实例化的类对象可否迭代?
一般的类是不可迭代的,如果要使一个类可迭代,需要在其内部定义好__iter__以及__next__方法,在循环类的过程中,先调用iter方法,然后调用next方法查询下一个数。

python的垃圾回收机制

以引用机制为主,标记-清除和分代收集(隔代回收为辅)
引用机制:对于一个字段,引用一次计数加一,引用失效技术减一,为0时回收改字段。
标记-清除:给所有对象打上标记,清除没有标记的对象
分代收集:分为老中青三代,青代满了开始清除,未清除的移到中代。

python的迭代器和生成器

迭代器:一个类不是可迭代的对象,在其中实现__iter__方法生成一个迭代器,然后后用__next__方法调用迭代对象。
生成器:本质上就是一个迭代器,不过不需要实现_iter__和__next__方法,只需要yield一个关键字。

python的装饰器是用来干嘛的

在原函数的基础上为其添加一个装饰器,在不改动源代码的情况下为其添加新的功能。

python中的元组和列表的区别

元组不可改变,元组的访问速度更快,当元组内只有一个元素的时候,逗号也不能省略
1、列表是动态的,属于可变序列,它的元素可以随时增加、修改或者删除,而元组是静态的,属于不可变序列,无法增加、删除、修改元素,除非整体替换。
2、列表可以使用append()、extend()、insert()、remove()和pop()等方法实现添加和修改列表元素,而元组则没有这几个方法,因为不能向元组中添加和修改元素。同样,也不能删除元素,可以整体替换。
3、列表可以使用切片访问和修改列表中的元素。元组也支持切片,但是它只支持通过切片访问元组中的元素,不支持修改。
4、元组比列表的访问和处理速度快。所以如果只需要对其中的元素进行访问,而不进行任何修改,建议使用元组而不使用列表。
5、因为列表可以修改,元组不可以修改,因此元组比列表具有更高的安全性。
6、列表不能作为字典的键,而元组可以。
7、存储方式不同:空列表 比空元组多占用16个字节。

python的集合

可以用set()函数来直接生成集合(不能用a={}之类的方式来定义)
相比于列表,集合是无需的,且其中无重复元素
set()会剔除原数据结构中的重复元素

python的多线程怎么写

Python中使用线程有两种方式:函数或者用类来包装线程对象。

  1. 用函数创建多线程
    在Python3中,Python提供了一个内置模块 threading.Thread,可以很方便地让我们创建多线程。
    调用thread模块中的start_new_thread()函数来产生新线程。语法如下:
thread.start_new_thread ( function, args[, kwargs] )


实例:来自菜鸟教程
import thread
import time
 
# 为线程定义一个函数
def print_time( threadName, delay):
   count = 0
   while count < 5:
      time.sleep(delay)
      count += 1
      print "%s: %s" % ( threadName, time.ctime(time.time()) )
 
# 创建两个线程
try:
   thread.start_new_thread( print_time, ("Thread-1", 2, ) )
   thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
   print "Error: unable to start thread"
  1. 使用Thread类
    使用Threading模块创建线程,直接从threading.Thread继承,然后重写__init__方法和run方法:
import threading
import time
 
exitFlag = 0
 
class myThread (threading.Thread):   #继承父类threading.Thread
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):                   #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数 
        print "Starting " + self.name
        print_time(self.name, self.counter, 5)
        print "Exiting " + self.name
 
def print_time(threadName, delay, counter):
    while counter:
        if exitFlag:
            (threading.Thread).exit()
        time.sleep(delay)
        print "%s: %s" % (threadName, time.ctime(time.time()))
        counter -= 1
 
# 创建新线程
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
 
# 开启线程
thread1.start()
thread2.start()
 
print "Exiting Main Thread"

每实例化一次thread即就是创建一个新线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LSQ的测试日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值