文章目录

  • 1.Python 和 C、C++、Java等其他语言的对比
  • 2.请至少列举 5 个 PEP8 规范(越多越好)
  • 3.python中的hashable(可哈希的)是什么意思
  • 4.字典按值排序
  • 5.请按list1中元素的age由大到小排序
  • 6.简述字符串驻留机制
  • 7.给定两个列表,怎么找出他们相同的元素和不同的元素?
  • 8.请写出一段Python代码实现删除一个list里面的重复元素
  • 9.下面这段代码的输出结果是什么?请解释?
  • 10.将以下3 个函数按照执行效率高低排序


1.Python 和 C、C++、Java等其他语言的对比

1.C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言。C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加语言的复杂度,也为另一部分所诟病。Java则吸取了C++的教训,取消了指针操作,也取消了C++改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于C++/C。一般而言,C,C++,java被视为同一系的语言,它们长期占据着程序使用榜的前三名。
C语言的优点:简洁紧凑、灵活方便;运算符丰富;数据类型丰富;表达方式灵活实用;允许直接访问物理地址,对硬件进行操作;生成目标代码质量高,程序执行效率高;可移植性好;表达力强;
C语言的缺点:C语言的缺点主要表现在数据的封装性上,这一点使得C在数据的安全性上有很大缺陷,这也是C和C++的一大区别。 C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。也就是说,对用C语言的人,要求对程序设计更熟练一些。

2.C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。
C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。
C++语言的程序因为要体现高性能,所以都是编译型的。但其开发环境,为了方便测试,将调试环境做成解释型的。即开发过程中,以解释型的逐条语句执行方式来进行调试,以编译型的脱离开发环境而启动运行的方式来生成程序最终的执行代码。
生成程序是指将源码(C++语句)转换成一个可以运行的应用程序的过程。如果程序的编写是正确的,那么通常只需按一个功能键,即可搞定这个过程。该过程实际上分成两个步骤。
第一步是对程序进行编译,这需要用到编译器(compiler)。编译器将C++语句转换成机器码(也称为目标码);如果这个步骤成功,下一步就是对程序进行链接,这需要用到链接器(linker)。链接器将编译获得机器码与C++库中的代码进行合并。C++库包含了执行某些常见任务的函数(“函数”是子程序的另一种称呼)。例如,一个C++库中包含标准的平方根函数sqrt,所以不必亲自计算平方根。C++库中还包含一些子程序,它们把数据发送到显示器,并知道如何读写硬盘上的数据文件。

  1. Java语言,Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
    Java的优势,与传统程序不同,Sun 公司在推出 Java 之际就将其作为一种开放的技术。全球数以万计的 Java 开发公司被要求所设计的 Java软件必须相互兼容。“Java 语言靠群体的力量而非公司的力量”是Sun公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同。Sun 公司对 Java 编程语言的解释是:Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。

4.python语言,是一种面向对象、直译式计算机程序设计语言,Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起。常见的一种应用情形是,使用python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写。
Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools, itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具。Python本身被设计为可扩充的。并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和工具,以便程序员能够轻松地使用C语言、C++、Cython来编写扩充模块。Python编译器本身也可以被集成到其它需要脚本语言的程序内。因此,很多人还把Python作为一种“胶水语言”(glue language)使用。使用Python将其他语言编写的程序进行集成和封装。

2.请至少列举 5 个 PEP8 规范(越多越好)

  • 使用space(空格)来表示缩进,而不要用tab(制表符)
  • 和语法相关的每一层缩进都要用4个空格来表示
  • 每行的字符数不应超过79
  • 对于占据多行的长表达式来说,除了首行之外的其余各行都应该在通常的缩进级别之上再加上4个空格
  • 文件中函数与类之间应该用两个空行隔开
  • 在同一个类中,各方法之间应该用一个空行隔开
  • 函数、变量及属性应该用小写字母来拼写,各单词之间以下划线相连,例如:lowercase_underscore
  • 类中的实例方法(instance method),应该把首个参数命名为self,以表示该对象自身
  • 类方法(class method)的首个参数,应该命名为cls,以表示该类自身
  • 不要通过检测长度的方法(如if len(somelist) == 0)来判断somelist是否为[]或“”等空值,而是应该采用if not somelist,它会假定:空值会自动评估为False

想详细了解的,这里推荐一篇博客:Python PEP8 编码规范中文版

3.python中的hashable(可哈希的)是什么意思

一个对象在其生命周期内,如果保持不变,就是hashable(可哈希的)。

hashable ≈ imutable 可哈希 ≈ 不可变

在Python中:
list、set和dictionary 都是可改变的,比如可以通过list.append(),set.remove(),dict[‘key’] = value对其进行修改,所以它们都是不可哈希的;而tuple和string是不可变的,只可以做复制或者切片等操作,所以它们就是可哈希的。

4.字典按值排序

dict1={'a':24,'g':52,'i':12,'k':33}

sorted(dict1.items(),key=lambda x:x[1])

5.请按list1中元素的age由大到小排序

list1 = [{'name':'a','age':20},{'name':'b','age':30},{'name':'c','age':25}]

sorted(list1,key=lambda x:x['age'],reverse=True)

6.简述字符串驻留机制

对于短字符串,将其赋值给多个不同的对象时,内存中只有一个副本,多个对象共享该副 本。长字符串不遵守驻留机制。
驻留适用范围: 由数字,字符和下划线(_)组成的python标识符以及整数[-5,256]。

7.给定两个列表,怎么找出他们相同的元素和不同的元素?

list1 = [1,2,3]
list2 = [3,4,5]
set1 = set(list1)
set2 = set(list2)
print(set1&set2) # {3}
print(set1^set2) # {1, 2, 4, 5}

8.请写出一段Python代码实现删除一个list里面的重复元素

比较简单的是利用集合的特性去重:

l1 = ['b','c','d','b','c','a','a']
l2 = list(set(l1))

如果想要保持他们原来的排序(3种方法):
最先想到的方法应该是遍历:

l1 = ['b', 'c', 'd', 'b', 'c', 'a', 'a']
l2 = []
for i in l1:
    if i not in l2:
	    l2.append(i)
print(l2) # ['b', 'c', 'd', 'a']

可以用list类的sort方法:

l1 = ['b','c','d','b','c','a','a']
l2 = list(set(l1))
l2.sort(key=l1.index)
print(l2)
# ['b', 'c', 'd', 'a']

同样用sorted方法也可以:

l1 = ['b','c','d','b','c','a','a']
l2 = sorted(set(l1),key=l1.index)
print(l2) # ['b', 'c', 'd', 'a']

9.下面这段代码的输出结果是什么?请解释?

def extendlist(val, list=[]):
    list.append(val)
    return list
list1 = extendlist(10)
list2 = extendlist(123, [])
list3 = extendlist('a')
print("list1 = %s" %list1)
print("list2 = %s" %list2)
print("list3 = %s" %list3)

"""
输出结果:
list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']
"""

新的默认列表只在函数被定义的那一刻创建一次。当extendList被没有指定特定参数list调用时,这组list的值随后将被使用。这是因为带有默认参数的表达式在函数被定义的时候被计算,不是在调用的时候被计算。

10.将以下3 个函数按照执行效率高低排序

def f1(lIn):
    l1 = sorted(lIn)
    l2 = [i for i in l1 if i<0.5]
    return [i*i for i in l2]

def f2(lIn):
    l1 = [i for i in lIn if i<0.5]
    l2 = sorted(l1)
    return [i*i for i in l2]

def f3(lIn):
    l1 = [i*i for i in lIn]
    l2 = sorted(l1)
    return [i for i in l1 if i<(0.5*0.5)]

效率:f(2) > f(3)> f(1)

python 可用cProfile模块分析代码的性能:

import random
import cProfile
lIn = [random.random() for i in range(100000)]
cProfile.run('f1(lIn)')
cProfile.run('f2(lIn)')
cProfile.run('f3(lIn)')

结果:

7 function calls in 0.065 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.001    0.001    0.065    0.065 <string>:1(<module>)
        1    0.000    0.000    0.065    0.065 {built-in method builtins.exec}
        1    0.054    0.054    0.054    0.054 {built-in method builtins.sorted}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        1    0.000    0.000    0.064    0.064 测试.py:52(f1)
        1    0.007    0.007    0.007    0.007 测试.py:54(<listcomp>)
        1    0.003    0.003    0.003    0.003 测试.py:55(<listcomp>)


         7 function calls in 0.022 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.001    0.001    0.022    0.022 <string>:1(<module>)
        1    0.000    0.000    0.022    0.022 {built-in method builtins.exec}
        1    0.015    0.015    0.015    0.015 {built-in method builtins.sorted}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        1    0.000    0.000    0.021    0.021 测试.py:57(f2)
        1    0.003    0.003    0.003    0.003 测试.py:58(<listcomp>)
        1    0.003    0.003    0.003    0.003 测试.py:60(<listcomp>)


         7 function calls in 0.042 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.001    0.001    0.042    0.042 <string>:1(<module>)
        1    0.000    0.000    0.042    0.042 {built-in method builtins.exec}
        1    0.032    0.032    0.032    0.032 {built-in method builtins.sorted}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        1    0.000    0.000    0.041    0.041 测试.py:62(f3)
        1    0.005    0.005    0.005    0.005 测试.py:63(<listcomp>)
        1    0.003    0.003    0.003    0.003 测试.py:65(<listcomp>)