zoukankan      html  css  js  c++  java
  • 很基础,也很值得回顾

    18.    Python如何实现单例模式?其他23种设计模式python如何实现?

     Python有两种方式可以实现单例模式,下面两个例子使用了不同的方式实现单例模式:
    1.
    class Singleton(type):
    def __init__(cls, name, bases, dict):
    super(Singleton, cls).__init__(name, bases, dict)
    cls.instance = None

    def __call__(cls, *args,**kw):
    if cls.instance is None:
    cls.instance = super(Singleton, cls).__call__(*args, **kw)

    return cls.instance

    class MyClass(object):
    __metaclass__ = Singleton

    print MyClass()
    print MyClass()
    2. 使用decorator来实现单例模式
    def singleton(cls):
    instances = {}
    def getinstance():
    if cls not in instances:
    instances[cls] = cls()
    return instances[cls]
    return getinstance

    @singleton
    class MyClass:

    19.    华为一道编程

    有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;
    要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
    1. 将两序列合并为一个序列,并排序,为序列Source
    2. 拿出最大元素Big,次大的元素Small
    3. 在余下的序列S[:-2]进行平分,得到序列max,min
    4. 将Small加到max序列,将Big加大min序列,重新计算新序列和,和大的为max,小的为min。

    Python代码

    def mean( sorted_list ):

    if not sorted_list:

    return (([],[]))

    big = sorted_list[-1]

    small = sorted_list[-2]

    big_list, small_list =mean(sorted_list[:-2])

    big_list.append(small)

    small_list.append(big)

    big_list_sum =sum(big_list)

    small_list_sum =sum(small_list)

    if big_list_sum >small_list_sum:

    return ( (big_list,small_list))

    else:

    return (( small_list,big_list))

    tests = [  [1,2,3,4,5,6,700,800],

    [10001,10000,100,90,50,1],

    range(1, 11),

    [12312, 12311, 232, 210,30, 29, 3, 2, 1, 1]

    ]

    for l in tests:

    l.sort()

    print

    print “Source List: ”,l

    l1,l2 = mean(l)

    print “Result List: ”,l1, l2

    print “Distance: ”,abs(sum(l1)-sum(l2))

    print ‘-*’*40

    输出结果

    Python代码

    Source List:   [1, 2, 3, 4, 5, 6, 700, 800]

    Result List:   [1, 4, 5, 800] [2, 3, 6, 700]

    Distance:      99

    -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

    Source List:   [1, 50, 90, 100, 10000, 10001]

    Result List:   [50, 90, 10000] [1, 100, 10001]

    Distance:      38

    -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

    Source List:   [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    Result List:   [2, 3, 6, 7, 10] [1, 4, 5, 8, 9]

    Distance:      1

    -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

    Source List:   [1, 1, 2, 3, 29, 30, 210, 232, 12311, 12312]

    Result List:   [1, 3, 29, 232, 12311] [1, 2, 30, 210, 12312]

    Distance:      21

    20.    python程序中文输出问题怎么解决?

    方法一:
    用encode和decode
    如:
    import os.path
    import xlrd,sys

    Filename=’/home/tom/Desktop/1234.xls’
    if not os.path.isfile(Filename):
    raise NameError,”%s is not a valid filename”%Filename

    bk=xlrd.open_workbook(Filename)
    shxrange=range(bk.nsheets)
    print shxrange

    for x in shxrange:
    p=bk.sheets()[x].name.encode(‘utf-8′)
    print p.decode(‘utf-8′)

    方法二:
    在文件开头加上
    reload(sys)
    sys.setdefaultencoding(‘utf8′)这2行,再试着运行一下

    字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。 

    decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。 

    encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。 

    因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码

    代码中字符串的默认编码与代码文件本身的编码一致。 

    如:s='中文'

    如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。 

    如果字符串是这样定义:s=u'中文'

    则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。

    如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:

    isinstance(s,unicode)  #用来判断是否为unicode 

    用非unicode编码形式的str来encode会报错 

     如何获得系统的默认编码? 

    #!/usr/bin/env python
    #coding=utf-8
    import sys
    print sys.getdefaultencoding()  

    该段程序在英文WindowsXP上输出为:ascii 

    21.    python代码得到列表list的交集与差集

    交集

    b1=[1,2,3]

    b2=[2,3,4]

    b3 = [val for val in b1if val in b2]
    print b3

    差集

    b1=[1,2,3]
    b2=[2,3,4]
    b3 = [val for val in b1 if val not in b2]
    print b3

    差集实例
    ———-
    #/bin/env python
    # -*- coding:utf-8 -*-

    f =open(‘C:diff_dealerexcel.txt’)
    excel = f.readlines()
    f.close()

    f= open(‘C:diff_dealerdb.txt’)
    db = f.readlines()
    diff = [val for val in db if val not in excel]
    f.close()

    f =open(‘C:diff_dealerdiff.txt’, ‘w’)
    f.writelines(diff)
    f.close()

    print diff

    22.    写一个简单的python socket编程

    python 编写server的步骤:

    1第一步是创建socket对象。调用socket构造函数。如:

    socket = socket.socket(family, type )

    family参数代表地址家族,可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信。

    type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。

    2.第二步是将socket绑定到指定地址。这是通过socket对象的bind方法来实现的:

    socket.bind( address )由AF_INET所创建的套接字,address地址必须是一个双元素元组,格式是(host,port)。host代表主机,port代表端口号。如果端口号正在使用、主机名不正确或端口已被保留,bind方法将引发socket.error异常。

    3.第三步是使用socket套接字的listen方法接收连接请求。

    socket.listen( backlog )

    backlog指定最多允许多少个客户连接到服务器。它的值至少为1。收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。

    4.第四步是服务器套接字通过socket的accept方法等待客户请求一个连接。

    connection, address =socket.accept()

    调用accept方法时,socket会时入“waiting”状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回一个含有两个元素的元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素address是客户的Internet地址。

    5. 第五步是处理阶段,服务器和客户端通过send和recv方法通信(传输数据)。服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recv方法从客户接收信息。调用recv 时,服务器必须指定一个整数,它对应于可通过本次方法调用来接收的最大数据量。recv方法在接收数据时会进入“blocked”状态,最后返回一个字符串,用它表示收到的数据。如果发送的数据量超过了recv所允许的,数据会被截短。多余的数据将缓冲于接收端。以后调用recv时,多余的数据会从缓冲区删除(以及自上次调用recv以来,客户可能发送的其它任何数据)。

    6. 传输结束,服务器调用socket的close方法关闭连接。

    python编写client的步骤:

    1. 创建一个socket以连接服务器:socket= socket.socket( family, type )

    2.使用socket的connect方法连接服务器。对于AF_INET家族,连接格式如下:

    socket.connect((host,port) )

    host代表服务器主机名或IP,port代表服务器进程所绑定的端口号。如连接成功,客户就可通过套接字与服务器通信,如果连接失败,会引发socket.error异常。

    3. 处理阶段,客户和服务器将通过send方法和recv方法通信。

    4. 传输结束,客户通过调用socket的close方法关闭连接。

    下面给个简单的例子:

    server.py

    if __name__ =='__main__':

    import socket

    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    sock.bind(('localhost',8001))

    sock.listen(5)

    while True:

    connection,address =sock.accept()

    try:

    connection.settimeout(5)

    buf =connection.recv(1024)

    if buf == '1':

    connection.send('welcometo server!')

    else:

    connection.send('pleasego out!')

    except socket.timeout:

    print 'time out'

    connection.close()

    client.py

    python 代码

    if __name__ =='__main__':

    import socket

    sock =socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    sock.connect(('localhost',8001))

    import time

    time.sleep(2)

    sock.send('1')

    print sock.recv(1024)

    sock.close()

    在终端运行server.py,然后运行clien.py,会在终端打印“welcometo server!"。如果更改client.py的sock.

    23.    Python文件操作的面试题

    1. 如何用Python删除一个文件?
    使用os.remove(filename)或者os.unlink(filename);

    2. Python如何copy一个文件?

    shutil模块有一个copyfile函数可以实现文件拷贝

    1:Python如何实现单例模式?  

    Python有两种方式可以实现单例模式,下面两个例子使用了不同的方式实现单例模式:
    1.
    class Singleton(type):
    def __init__(cls, name, bases, dict):
    super(Singleton, cls).__init__(name, bases, dict)
    cls.instance = None

    def __call__(cls, *args, **kw):
    if cls.instance is None:
    cls.instance = super(Singleton, cls).__call__(*args, **kw)

    return cls.instance

    class MyClass(object):
    __metaclass__ = Singleton

    print MyClass()
    print MyClass()
    2. 使用decorator来实现单例模式
    def singleton(cls):
    instances = {}
    def getinstance():
    if cls not in instances:
    instances[cls] = cls()
    return instances[cls]
    return getinstance

    @singleton
    class MyClass:

    2:什么是lambda函数?

    Python允许你定义一种单行的小函数。定义lambda函数的形式如下:labmda参数:表达式lambda函数默认返回表达式的值。你也可以将其赋值给一个变量。lambda函数可以接受任意个参数,包括可选参数,但是表达式只有一个:
    >>> g = lambda x, y: x*y
    >>> g(3,4)
    12
    >>> g = lambda x, y=0, z=0: x+y+z
    >>> g(1)
    1
    >>> g(3, 4, 7)
    14
    也能够直接使用lambda函数,不把它赋值给变量:
    >>> (lambda x,y=0,z=0:x+y+z)(3,5,6)
    14
    如果你的函数非常简单,只有一个表达式,不包含命令,可以考虑lambda函数。否则,你还是定义函数才对,毕竟函数没有这么多限制。

    3:Python是如何进行类型转换的?

    Python提供了将变量或值从一种类型转换成另一种类型的内置函数。int函数能够将符合数学格式数字型字符串转换成整数。否则,返回错误信息。
    >>> int(”34″)
    34
    >>> int(”1234ab”) #不能转换成整数
    ValueError: invalid literal for int(): 1234ab
    函数int也能够把浮点数转换成整数,但浮点数的小数部分被截去。
    >>> int(34.1234)
    34
    >>> int(-2.46)
    -2
    函数°oat将整数和字符串转换成浮点数:
    >>> float(”12″)
    12.0
    >>> float(”1.111111″)
    1.111111
    函数str将数字转换成字符:
    >>> str(98)
    ‘98′
    >>> str(”76.765″)
    ‘76.765′
    整数1和浮点数1.0在python中是不同的。虽然它们的值相等的,但却属于不同的类型。这两个数在计算机的存储形式也是不一样。

    4:Python如何定义一个函数

    函数的定义形式如
    下:
    def <name>(arg1, arg2,… argN):
    <statements>
    函数的名字也必须以字母开头,可以包括下划线“ ”,但不能把Python的
    关键字定义成函数的名字。函数内的语句数量是任意的,每个语句至少有
    一个空格的缩进,以表示此语句属于这个函数的。缩进结束的地方,函数
    自然结束。
    下面定义了一个两个数相加的函数:
    >>> def add(p1, p2):
    print p1, “+”, p2, “=”, p1+p2
    >>> add(1, 2)
    1 + 2 = 3
    函数的目的是把一些复杂的操作隐藏,来简化程序的结构,使其容易
    阅读。函数在调用前,必须先定义。也可以在一个函数内部定义函数,内
    部函数只有在外部函数调用时才能够被执行。程序调用函数时,转到函数
    内部执行函数内部的语句,函数执行完毕后,返回到它离开程序的地方,
    执行程序的下一条语句。

    5:Python是如何进行内存管理的?

    Python的内存管理是由Python得解释器负责的,开发人员可以从内存管理事务中解放出来,致力于应用程序的开发,这样就使得开发的程序错误更少,程序更健壮,开发周期更短

    6:如何反序的迭代一个序列?howdo I iterate over a sequence in reverse order

    如果是一个list, 最快的解决方案是:

    list.reverse()
    try:
    for x in list:
    “do something with x”
    finally:
    list.reverse()

    如果不是list, 最通用但是稍慢的解决方案是:

    for i in range(len(sequence)-1, -1, -1):
    x = sequence[i]
    <do something with x>

    7:Python里面如何实现tuple和list的转换?

    函数tuple(seq)可以把所有可迭代的(iterable)序列转换成一个tuple, 元素不变,排序也不变。

    例如,tuple([1,2,3])返回(1,2,3),tuple(’abc’)返回(’a’.’b',’c').如果参数已经是一个tuple的话,函数不做任何拷贝而直接返回原来的对象,所以在不确定对象是不是tuple的时候来调用tuple()函数也不是很耗费的。

    函数list(seq)可以把所有的序列和可迭代的对象转换成一个list,元素不变,排序也不变。

    例如 list([1,2,3])返回(1,2,3),list(’abc’)返回['a', 'b', 'c']。如果参数是一个list,她会像set[:]一样做一个拷贝

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

    可以先把list重新排序,然后从list的最后开始扫描,代码如下:

    if List:
    List.sort()
    last = List[-1]
    for i in range(len(List)-2, -1, -1):
    if last==List[i]: del List[i]
    else: last=List[i]

    9:Python文件操作的面试题

    1. 如何用Python删除一个文件?
    使用os.remove(filename)或者os.unlink(filename);

    2. Python如何copy一个文件?
    shutil模块有一个copyfile函数可以实现文件拷贝

    10:Python里面如何生成随机数?

    标准库random实现了一个随机数生成器,实例代码如下:

    import random

    random.random()

    它会返回一个随机的0和1之间的浮点数

    11:如何用Python来发送邮件?

    可以使用smtplib标准库。

    以下代码可以在支持SMTP监听器的服务器上执行。

    import sys, smtplib

    fromaddr = raw_input(”From: “)
    toaddrs = raw_input(”To: “).split(’,')
    print “Enter message, end with ^D:”
    msg = ”
    while 1:
    line = sys.stdin.readline()
    if not line:
    break
    msg = msg + line

    # 发送邮件部分
    server = smtplib.SMTP(’localhost’)
    server.sendmail(fromaddr, toaddrs, msg)
    server.quit()

    12:Python里面如何拷贝一个对象?

    一般来说可以使用copy.copy()方法或者copy.deepcopy()方法,几乎所有的对象都可以被拷贝

    一些对象可以更容易的拷贝,Dictionaries有一个copy方法:

    newdict = olddict.copy()

    13:有没有一个工具可以帮助查找python的bug和进行静态的代码分析?

    有,PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告

    Pylint是另外一个工具可以进行coding standard检查。

    14:如何在一个function里面设置一个全局的变量?

    解决方法是在function的开始插入一个global声明:

    def f()

    global x

    14:有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。

    1. 将两序列合并为一个序列,并排序,为序列Source

    2. 拿出最大元素Big,次大的元素Small

    3. 在余下的序列S[:-2]进行平分,得到序列max,min

    4. 将Small加到max序列,将Big加大min序列,重新计算新序列和,和大的为max,小的为min。

    Python代码

    def mean( sorted_list ):

    if not sorted_list:

    return (([],[]))

    big = sorted_list[-1]

    small = sorted_list[-2]

    big_list, small_list = mean(sorted_list[:-2])

    big_list.append(small)

    small_list.append(big)

    big_list_sum = sum(big_list)

    small_list_sum = sum(small_list)

    if big_list_sum > small_list_sum:

    return ( (big_list, small_list))

    else:

    return (( small_list, big_list))

    tests = [   [1,2,3,4,5,6,700,800],

    [10001,10000,100,90,50,1],

    range(1, 11),

    [12312, 12311, 232, 210, 30, 29, 3, 2, 1, 1]

    ]

    for l in tests:

    l.sort()

    print

    print “Source List: ”, l

    l1,l2 = mean(l)

    print “Result List: ”, l1, l2

    print “Distance: ”, abs(sum(l1)-sum(l2))

    print ‘-*’*40

    输出结果

    Python代码

    Source List:    [1, 2, 3, 4, 5, 6, 700, 800]

    Result List:    [1, 4, 5, 800] [2, 3, 6, 700]

    Distance:       99

    -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

    Source List:    [1, 50, 90, 100, 10000, 10001]

    Result List:    [50, 90, 10000] [1, 100, 10001]

    Distance:       38

    -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

    Source List:    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    Result List:    [2, 3, 6, 7, 10] [1, 4, 5, 8, 9]

    Distance:       1

    -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

    Source List:    [1, 1, 2, 3, 29, 30, 210, 232, 12311, 12312]

    Result List:    [1, 3, 29, 232, 12311] [1, 2, 30, 210, 12312]

    Distance:       21

    -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

    15:用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别?

    当重复匹配一个正则表达式时候, 例如<.*>, 当程序执行匹配的时候,会返回最大的匹配值

    例如:

    import re
    s = ‘<html><head><title>Title</title>’
    print(re.match(’<.*>’, s).group())

    会返回一个匹配<html><head><title>Title</title>而不是<html>

    import re
    s = ‘<html><head><title>Title</title>’
    print(re.match(’<.*?>’, s).group())

    则会返回<html>

    <.*>这种匹配称作贪心匹配 <.*?>称作非贪心匹配

    16:Python里面search()和match()的区别?

    match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找匹配, 也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none

    例如:

    print(re.match(’super’, ’superstition’).span())会返回(0,5)
    而print(re.match(’super’, ‘insuperable’))则返回None

    search()会扫描整个字符串并返回第一个成功的匹配

    例如:print(re.search(’super’, ’superstition’).span())返回(0, 5)

    print(re.search(’super’, ‘insuperable’).span())返回(2,7)

    17:如何用Python来进行查询和替换一个文本字符串?

    可以使用sub()方法来进行查询和替换,sub方法的格式为:sub(replacement, string[, count=0])

    replacement是被替换成的文本

    string是需要被替换的文本

    count是一个可选参数,指最大被替换的数量

    例子:

    import re
    p = re.compile(’(blue|white|red)’)
    print(p.sub(’colour’,'blue socks and red shoes’))
    print(p.sub(’colour’,'blue socks and red shoes’, count=1))

    输出:

    colour socks and colour shoes
    colour socks and red shoes

    subn()方法执行的效果跟sub()一样,不过它会返回一个二维数组,包括替换后的新的字符串和总共替换的数量

    例如:

    import re
    p = re.compile(’(blue|white|red)’)
    print(p.subn(’colour’,'blue socks and red shoes’))
    print(p.subn(’colour’,'blue socks and red shoes’, count=1))

    输出

    (’colour socks and colour shoes’, 2)
    (’colour socks and red shoes’, 1)

    18:介绍一下except的用法和作用?

    Python的except用来捕获所有异常, 因为Python里面的每次错误都会抛出 一个异常,所以每个程序的错误都被当作一个运行时错误。

    一下是使用except的一个例子:

    try:

    foo = opne(”file”) #open被错写为opne

    except:

    sys.exit(”could not open file!”)

    因为这个错误是由于open被拼写成opne而造成的,然后被except捕获,所以debug程序的时候很容易不知道出了什么问题

    下面这个例子更好点:

    try:
    foo = opne(”file”) # 这时候except只捕获IOError
    except IOError:
    sys.exit(”could not open file”)

    19:Python中pass语句的作用是什么?

    pass语句什么也不做,一般作为占位符或者创建占位程序,pass语句不会执行任何操作,比如:

    while False:

    pass

    pass通常用来创建一个最简单的类:

    class MyEmptyClass:

    pass

    pass在软件设计阶段也经常用来作为TODO,提醒实现相应的实现,比如:

    def initlog(*args):

    pass #please implement this

    20:介绍一下Python下range()函数的用法?

    如果需要迭代一个数字序列的话,可以使用range()函数,range()函数可以生成等差级数。

    如例:

    for i in range(5)

    print(i)

    这段代码将输出0, 1, 2, 3, 4五个数字

    range(10)会产生10个值, 也可以让range()从另外一个数字开始,或者定义一个不同的增量,甚至是负数增量

    range(5, 10)从5到9的五个数字
    range(0, 10, 3) 增量为三, 包括0,3,6,9四个数字
    range(-10, -100, -30) 增量为-30, 包括-10, -40, -70
    可以一起使用range()和len()来迭代一个索引序列
    例如:
    a = ['Nina', 'Jim', 'Rainman', 'Hello']
    for i in range(len(a)):
        print(i, a[i])
  • 相关阅读:
    python中的编码问题
    CVPR2018 Tutorial 之 Visual Recognition and Beyond
    hdu 1376 Octal Fractions
    hdu 1329 Hanoi Tower Troubles Again!
    hdu 1309 Loansome Car Buyer
    hdu 1333 Smith Numbers
    hdu 1288 Hat's Tea
    hdu 1284 钱币兑换问题
    hdu 1275 两车追及或相遇问题
    hdu 1270 小希的数表
  • 原文地址:https://www.cnblogs.com/pyxiaomangshe/p/8064330.html
Copyright © 2011-2022 走看看