芸品绿-PythonWeb开发工程师

1.Python常用的数据结构的类型及其特性?

  • 数值类型:
    • 整数(int): 通常被称为是整型或整数,是正或负整数,不带小数点。Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 没有 Python2 的 Long 类型。
    • 浮点型(float): 浮点型由整数部分与小数部分组成
    • 复数((complex)):复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型。
  • 列表(List): 是一个可变容器模型,可以存储任意类型的变量。List简单的来时就是两个中括号[ ]抱起来的有序集合,里面的元素可以是任意类型。
  • 元组(tuple):是由( )小括号包起来的不可更改的有序数列,元组的元素不可变,元组的元素可变。
  • 字典(dict): 字典是一个无序的序列,它的每一项(item)都是一个键(key)值(value)对.
  • 集合(set): 集合数学里的集合,是一个无序,互异的序列。

2.已知AList = [1,2,3,1,2],对AList列表元素去重,写出具体过程。

对列表去重有四种方法,如下代码:

def func1(one_list):  
    ''''' 
    使用集合 
    '''  
    return list(set(one_list))  


def func2(one_list):  
    ''''' 
    使用字典的方式 
    '''  
    return {}.fromkeys(one_list).keys()  


def func3(one_list):  
    ''''' 
    使用列表推导的方式 
    '''  
    temp_list=[]  
    for one in one_list:  
        if one not in temp_list:  
            temp_list.append(one)  
    return temp_list  


def func4(one_list):  
    ''''' 
    使用排序的方法 
    '''  
    result_list=[]  
    temp_list=sorted(one_list)  
    i=0  
    while i<len(temp_list):  
        if temp_list[i] not in result_list:  
            result_list.append(temp_list[i])  
        else:  
            i+=1  
    return result_list  


if __name__ == '__main__':  
    AList=[1,2,3,1,2]  
    print func1(AList)  
    print func2(AList)  
    print func3(AList)  
    print func4(AList)

3.选出一下表达式表述正确的选项:

A:{1:02:03:0}
B:{”a“:0, "b":0, "c":0}
C: {(1,2):0, (2,3):0}
D: {[1,2]:0, [2,3]:0}

答案:首先,字典的键(key)必须的唯一的,但值(value)则不必。值(value)可以取任何数据类型,但键(key)必须是不可变的,如:字符串、数字、元组
所以,以上的正确选项是:ABC

4. 已知:

AList = [1,2,3]
BSet = {1,2,3}
  • (1) 从AList 和 BSet中 查找 4,最坏时间复杂度那个大?
  • (2) 从AList 和 BSet中 插入 4,最坏时间复杂度那个大?

5.已知:

A = {1,2,3}
B = {1,2,4}
  • (1) 求A 和 B 的 交集?

    • A & B
  • (2) 求A 和 B 的 并集?

    • A | B
  • (3) 求A 和 B 的 差集?

    • A - B

6. 已知ip = ”192.168.0.100“提取ip的各部分并写入列表的实现过程。

ip_list = ip.split(".")

7. 已知 AList = [“a”,”b”,”c”]将AList转换成”a,b,c“的实现过程。

Alist = ["a","b","c"]
Astr = ",".join(Alist)

8. ADist = {”a“:0,”b”:1, “c”:2}判断”h“ 是否是ADist的key?(写出具体的实现过程)

ADict = {"a":0, "b":1, "c":1}

for key in ADict.keys():

    if "h" is key:
        print("存在")
else:
    print("不存在")

9. Python的进程、线程、协程有什么区别?

概念:

  • 进程:

    进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。
  • 线程:

    线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。
  • 协程:

    协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

区别:
进程与线程比较:

线程是指进程内的一个执行单元,也是进程内的可调度实体。线程与进程的区别:
1) 地址空间:线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间
2) 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
3) 线程是处理器调度的基本单位,但进程不是
4) 二者均可并发执行
5) 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

协程与线程进行比较:

1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程,这样python中则能使用多核CPU。

2) 线程进程都是同步机制,而协程则是异步

3) 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态

10. 已知 AStr = ”123456“

  • (1)如何获取最后两个字符?

    Astr = "123456"    
    print(Astr[-2:])   
  • (2)如何获取第2个和第3个字符?

    Astr = "123456"    
    print(Astr[1:3])

11. python2中字符串编码有几种,与Python3有什么区别?字节和字符编码分别是什么意思?

在Python2中,字符串字面量对应于8位的字符或面向字节编码的字节字面量。
这些字符串的一个重要限制是它们无法完全地支持国际字符集和Unicode编码。
为了解决这种限制,Python2对Unicode数据使用了单独的字符串类型。
要输入Unicode字符串字面量,要在第一个引号前加上前最``'u'``。
Python2中还有一种称为字节字面量的字符串类型,它是指一个已经编码的字符串字面量,
在Python2中字节字面量和普通字符串没有差别,因为在Python2中普通字符串实际上就是已经编码(非Unicode)的字节字符串。
在Python3中,不必加入这个前缀字符,否则是语法错误,这是因为所有的字符串默认已经是Unicode编码了。
如果使用-U选项运行解释器,Python2会模拟这种行为(即所有字符串字面量将被作为Unicode字符对待,u前缀可以省略)。
在Python3中,字节字面量变成了与普通字符串不同的类型。

字节和字符编码分别是什么意思
一个字符不等价于一个字节,字符是人类能够识别的符号,而这些符号要保存到计算的存储中就需要用计算机能够识别的字节来表示。一个字符往往有多种表示方法,不同的表示方法会使用不同的字节数。这里所说的不同的表示方法就是指字符编码,比如字母A-Z都可以用ASCII码表示(占用一个字节),也可以用UNICODE表示(占两个字节),还可以用UTF-8表示(占用一个字节)。字符编码的作用就是将人类可识别的字符转换为机器可识别的字节码,以及反向过程。
UNICDOE才是真正的字符串,而用ASCII、UTF-8、GBK等字符编码表示的是字节串。关于这点,我们可以在Python的官方文档中经常可以看到这样的描述"Unicode string" , " translating a Unicode string into a sequence of bytes"
我们写代码是写在文件中的,而字符是以字节形式保存在文件中的,因此当我们在文件中定义个字符串时被当做字节串也是可以理解的。但是,我们需要的是字符串,而不是字节串。一个优秀的编程语言,应该严格区分两者的关系并提供巧妙的完美的支持。JAVA语言就很好,以至于了解Python和PHP之前我从来没有考虑过这些不应该由程序员来处理的问题。遗憾的是,很多编程语言试图混淆“字符串”和“字节串”,他们把字节串当做字符串来使用,PHP和Python2都属于这种编程语言。最能说明这个问题的操作就是取一个包含中文字符的字符串的长度:
- 对字符串取长度,结果应该是所有字符串的个数,无论中文还是英文
- 对字符串对应的字节串取长度,就跟编码(encode)过程使用的字符编码有关了(比如:UTF-8编码,一个中文字符需要用3个字节来表示;GBK编码,一个中文字符需要2个字节来表示)

12. 爬虫过程中碰到js加载后的数据,除了常规的模拟浏览器比如phantomjs之外,还有什么好的应对方法?

  1. 找到js的位置
    • event listener中观察绑定事件,点击进入js的位置
    • search all files中搜索 url地址中或者是参数中的关键字
  2. 分析js的过程:

    添加断点,重新刷新页面,能够在页面上看到每一步的返回结果,能够跳转到函数的位置,观察其中的函数的执行过程

猜你喜欢

转载自blog.csdn.net/PythonCodeZ/article/details/80496288