面试题01

1.python语言有哪些特点
python是一门面向对象的解释性语言
解释型,开源,简单,易学,免费
可扩展性,丰富的库,可移植性,面向对象
规范的代码(十分严格)

2.列举你所知道的排序算法,并用python语言实现一个排序
博客https://blog.csdn.net/mxz19901102/article/details/80087596
插入排序
希尔排序
冒泡排序
快速排序
选择排序
堆排序
基数排序
归并排序
3.python中的可变参数和关键字参数
可变参数:在Python函数中,可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。定义可变参数和定义普通参数相比,仅仅在参数前面加了一个*号,例如def cul(nums)。
关键字参数:可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。在参数前加2个
号即可,例如def cul(**kws)

第四题

def f(x,l=[]):
    for i in range(x):
        l.append(i*i)
    print(l)
f(2)#[0, 1]
f(3,[3,2,1])#列表内元素可重复 [3,2,1]+0 [0,1,,1,2,3,4]
f(3)#[0,1,,4]

5.下面这些是什么意思:@classmethod,@staticmethod,@property
链接https://www.cnblogs.com/wangyongsong/p/6750454.html
什么是特性property,property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
为什么要用property
将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则

import math
class Circle:
    def __init__(self,radius): #圆的半径radius
        self.radius=radius

    @property
    def area(self):
        return math.pi * self.radius**2 #计算面积

    @property
    def perimeter(self):
        return 2*math.pi*self.radius #计算周长

c=Circle(10)
print(c.radius)
print(c.area) #可以向访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值
print(c.perimeter) #同上
'''
输出结果:
314.1592653589793
62.83185307179586
'''

6.编程:输入一个字符串,输出该字符串中字符的所有组合
例如:输入字符串"1 2 3" 则输出为1,2,3,12,13,23,123,不考虑顺序,所以12,21的等价

7.谈谈你所知道的python web框架
Django flask web.py Tornado web2.py

8.python编程实现斐波那数列
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13,特别指出:第0项是0,第1项是第一个1。从第三项开始,每一项都等于前两项之和。
Python 实现斐波那契数列代码如下:

	# 获取用户输入数据

nterms = int(input(“你需要几项?”))

第一和第二项
n1 = 0
n2 = 1
count = 2

判断输入的值是否合法

if nterms <= 0:
   print("请输入一个正整数。")
elif nterms == 1:
   print("斐波那契数列:")
   print(n1)
else:
   print("斐波那契数列:")
   print(n1,",",n2,end=" , ")
   while count < nterms:
       nth = n1 + n2
       print(nth,end=" , ")
       # 更新值
       n1 = n2
       n2 = nth
       count += 1
a=0
b=1
while b < 1000:
    print(b)
    a, b = b, a+b

递归方式实现斐波那契数列 前n项:

# 递归方式实现 生成前20项

lis =[]
for i in range(20):

if i ==0 or i ==1:#第1,2项 都为1

lis.append(1)

else:

lis.append(lis[i-2]+lis[i-1])#从第3项开始每项值为前两项值之和

print(lis)

简述left join 和right join

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行

给定一个无序的整数数组a[],其中有n个整数 请写程序找到其中的中位数
1.取前len(nums)/2个元素建立小顶堆。可以知道堆顶元素是前len(nums)/2个元素中最小的。

2.从第len(nums)/2+1个元素开始,依次将其与堆顶元素比较。若比对顶元素大,则替换之,并调整堆。

3.数组剩下的所有元素比较完后,可以输出中位数。数组长度为奇数时,输出堆顶元素即可。数组长度为偶数时,输出堆顶元素与它的孩子结点中较小的那个的均值。

	#coding:utf-8
 
def heap_adjust(parent,heap):   #更新结点后进行调整
    child=2*parent+1
    while len(heap)>child:
        if child+1<len(heap):
            if heap[child+1]<heap[child]:
                child+=1
        if heap[parent]<=heap[child]:
            break
        heap[parent],heap[child]=heap[child],heap[parent]
        parent,child=child,child*2+1
 
def find(nums):
    heapnum=len(nums)//2
    heap=nums[:heapnum+1]
    for i in range(len(heap)//2-1,-1,-1):   #前n/2个元素建堆
        heap_adjust(i,heap)
    for j in range(heapnum+1,len(nums)):
        if nums[j]>heap[0]:
            heap[0]=nums[j]
            heap_adjust(0,heap)
    #奇数时是最中间的数,偶数时是最中间两数的均值
    return heap[0] if len(nums)%2==1 else float(heap[0]+min(heap[1],heap[2]))/2

python给定一个有序的整数数组a[],其中有n个整数,请写程序找到其中是否包含值等于
给定一个无序的整数数组a[],其中有n个整数,自己实现一个排序算法(不能调用系统排序函数),输出排序后结果

思路:冒泡法排序

封装一个工具,操作redis,不管什么端口来的,给一个键,返回值,封装成一个工具

import redis

class MyRedis():
    def __init__(self,ip,password,port=6379,db=1):#构造函数
        try:
            self.r = redis.Redis(host=ip,password=password,port=port,db=db)  #连接redis固定方法,这里的值必须固定写死
        except Exception as e:
            print('redis连接失败,错误信息%s'%e)
    def str_get(self,k):
        res = self.r.get(k)   #会从服务器传对应的值过来,性能慢
        if res:
            return res.decode()   #从redis里面拿到的是bytes类型的数据,需要转换一下

    def str_set(self,k,v,time=None): #time默认失效时间
        self.r.set(k,v,time)

    def delete(self,k):
        tag = self.r.exists(k)
        #判断这个key是否存在,相对于get到这个key他只是传回一个存在火灾不存在的信息,
        # 而不用将整个k值传过来(如果k里面存的东西比较多,那么传输很耗时)
        if tag:
            self.r.delete(k)
        else:
            print('这个key不存在')

    def hash_get(self,name,k):  #哈希类型存储的是多层字典(嵌套字典)
        res = self.r.hget(name,k)
        if res:
            return res.decode()  #因为get不到值得话也不会报错所以需要判断一下

    def hash_set(self,name,k,v): #哈希类型的是多层
        self.r.hset(name,k,v)   #set也不会报错

    def hash_getall(self,name):
        res = self.r.hgetall(name)   #得到的是字典类型的,里面的k,v都是bytes类型的
        data={}
        if res:
            for k,v in res.items(): #循环取出字典里面的k,v,在进行decode
                k = k.decode()
                v = v.decode()
                data[k]=v
        return data

    def hash_del(self,name,k):
        res = self.r.hdel(name,k)
        if res:
            print('删除成功')
            return 1
        else:
            print('删除失败,该key不存在')
            return 0

    @property   #属性方法,
                # 使用的时候和变量一个用法就好比实例,A=MyRedis(), A.clean_redis使用,
                # 如果不加这个@property,使用时A=MyRedis(), A.clean_redis()   后面需要加这个函数的括号
    def clean_redis(self):
        self.r.flushdb()   #清空 redis
        print('清空redis成功!')
        return 0



a = MyRedis('118.0000','HK0000*')

print(a.str_get('duan'))

以上答案来自网络,如果侵权联系删除

猜你喜欢

转载自blog.csdn.net/qq_42817166/article/details/84144687
今日推荐