python常见问题

1.列表、元组的相加是怎样实现的?

 (1)列表相加:①利用操作符+,例:

 a=[1,2,3],b=[4,5,6],c=a+b=[1,2,3,4,5,6]

   ②利用extend ,例:

a=[1,2,3],b=[4,5,6],a.extend(b)--->结果是[1,2,3,4,5,6]

  操作符+生成了一个新对象,而extend是修改原对象。
 (2)元组相加:直接采用操作符 +

2.内嵌函数和闭包有什么区别?

内嵌函数(函数嵌套):又称内置函数,即在函数中定义函数,内嵌函数的作用域在外部函数之内;
闭包:闭包是函数式编程的重要语法结构,提高了代码的可重复使用性。当一个内嵌函数引用其外部作用域的变量就会得到一个闭包。
创建闭包必须满足以下几点:①必须有一个内嵌函数;②内嵌函数必须引用外部函数中的变量;③外部函数的返回值必须是内嵌函数。
#函数嵌套:在函数内部再定义函数 def
#函数嵌套中优先寻找本层定义变量,再一层层往外找;最外层变量可以渗透到做内层
def father(name):
     print('from father %s' %name)
     def son():
         name = 'danny_1'
         print('我的爸爸是%s' %name)
         def grandson():
             name = '就是自己'
             print('我的爷爷是%s' %name)
         grandson()  #打印当前层的局部变量
     print (locals())
     son()
 father('Danielle')

3.__new____init__ 的区别?

①__new__是一个静态方法,而__init__是一个实例方法;
②__new__方法会返回一个创建的实例,__init__什么都不返回;
③只有在__new__返回一个cls的实例时后边的__init__才能被调用;
④当创建一个新实例时调用__new__,初始化一个实例时用__init__。

4.用python 怎样实现文件的读写功能(怎样实现python中的with功能)?

文件读写的操作步骤如下:①打开文件,获取文件描述符;②操作文件描述符的读写;③关闭文件。
with语句不仅仅用于文件操作,实际上是一个很通用的结构,允许使用上下文管理器。上下文管理器支持__enter__()__exit__()这两个方法,__enter__()方法不带任何参数,在进入with语句块的时候被调用,该方法的返回值会被赋值给as关键字之后的变量。__exit__()方法带有3个参数:type(异常类型)、value(异常信息)、trace(异常栈),当with语句的代码块执行完毕或执行过程中因为异常而被终止都会调用__exit__()方法。正常退出时该方法的3个参数都为None,异常退出时该方法的3个参数会被分别赋值。如果__exit__()方法返回值(真值测试结果)为True则表示异常已经被处理,命令执行结果中就不会抛出异常信息了;反之,如果__exit__()方法返回值(真值测试结果)为False,则表示异常没有被处理并且会向外抛出该异常。
with在操作文件时可以自动关闭文件,简化操作。其功能可用try…except…finally…异常处理机制来代替,无论有无异常,最终都将文件关闭掉。

5.python生成器在实际程序中怎样展现出来的?

生成器:可以理解为一种数据类型,这种数据类型自动实现了迭代器协议,生成器就是可迭代对象。
生成器函数:常规函数定义,但是用yield语句而不是用return语句返回结果,yield一次返回一个结果,自动实现迭代器协议(自动实现__next__()方法,无需再去调用__iter__()方法),调用生成器函数,不会立马执行该函数里边的代码,而是回返回一个生成器。
生成器可以将列表推导式的[]改成(),不会将所有的值一次性加载到内存当中,延迟计算,一次返回一个结果,不会一次生成所有结果;省内存,提高代码的可读性,生成器的好处是延迟计算,一次返回一个结果,生成器只能遍历一次。

6.什么是列表推导式?具体有何优点?

列表推导式是python中一种常用的数据结构。列表推导式提供了从序列创建列表的简单途径。通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据判断条件创建子序列。每个列表推导式都在for之后跟一个表达式,然后有0或多个for或if子句,返回结果是一个根据表达从其后的for和if上下文环境中生成出来的列表,如果希望表达式推导出一个元组,就必须使用括号。
列表推导式将所有的值一次性加载到内存中,可以遍历任意次;利用其它列表可以创建新列表。

    #也可以理解为三元表达式
    list=[2,4,6]
    list1=[4,3,-9]
    freshfruit=['  banana',' loganberry ','passion fruit  ']
    >>>[3*x for x in list]--->[6,12,18]
    >>>[[x,x**2] for x in list]--->[[2,4],[4,16],[6,36]]
    >>>[2*x for x in list if x>4]--->[8,12]
    >>>[2*x for x in list if x<2]--->[]
    >>>[a.strip() for a in freshfruit]
    --->['banana','loganberry','passion fruit']
     >>>[x*y for x in list for y in list1]
    --->[8,6,-18,16,12,-36,24,18,-54]
     >>>[list[i]*list1[1] for i in range(len(list))]
     --->[6,12,18]
     >>>[str(round(355/113,i)) for i in range(1,6)] 
     --->['3.1','3.14','3.142','3,1416','3.14159']

7.列表的sort()排序方法和python内置sorted排序方法有什么区别?

sort()函数是list列表中内置的函数,而sorted()可以对list或者iterator进行排序;用sort函数对列表排序会影响列表本身,而sorted()不会,python内置的全局sorted()方法对可迭代的序列排序生成新的序列;sorted()对所有的可迭代序列都有效。
sort/sorted(list,key,reverse):
          list:给定的排序列表
          key:排序过程调用的函数,也就是排序依据
          reverse:降序还是升序,默认为False升序,True降序

8.列表、字典、元组如何实现比较大小的?

列表比较:==、>、< 或者使用 is,返回布尔值true或False。列表比较是从第一个元素顺序开始比较,如果相等则继续,直到找到第一个不相等的元素并返回比较结果,如果一个列表的所有元素与另一个列表对应位置的元素都相等,则长的列表大。
字典的比较都是通过返回的整数值来比较大小的,字典的比较提供了一个cmp()方法:①比较字典的长度,如果字典的长度不同,用cmp(dict1,dict2)比较大小时,若果dict1比dict2长,cmp()返回正值,反之返回负值,字典中键的个数越多,这个字典就越大;②比较字典的键,如果两个字典的长度相等,就比较字典的键,键的比较顺序和keys()方法返回键的顺序相同(相同的键会映射到哈希表的同一位置,保证字典键的检查的一致性),若果两个字典的键不匹配,对这两个键比较大小就可以了,如果dict1中的第一个不同的键大于dict2中第一个不同的键,cmp()返回正值;③如果两个字典的长度相同并且他们的键也相同,则用每个相同的键所对应的值进行比较,一旦出现不匹配的值,就可以对字典进行比较了,如果dict1比dict2中相同的键的值大,cmp()返回正值,dict1>dict2;④如果两个字典有相同的长度,相同的键,相同的值,则两个字典相同,cmp()返回0。

9.python中常用的工具包有哪些?

1.字符串处理:
①re:正则表达式的标准库;
②StringIO/cStringIO:以读写文件的方式操作字符串;
③chardet:可以猜测任意一段文本的字符集编码,对于编码类型未知的文本,很有用。可以作为模块来使用,也可以作为命令行工具来使用。
2.数学类:
①math:数学标准库,封装了常用的数学函数;
②random:用于生成随机数;
③fractions:封装跟有理数(分数)相关的运算。
3.安全类:
①hashlib:计算各种散列值,支持的哈希算法有(MD5,SHA1,SHA224,SHA256,SHA384,SHA512);
②PyCrypto:包含常用的对称加密算法(DES,AES,IDEA);
③pyOpenSSL:这个库使用python对OpenSSL进行很薄的封装;
4.数据结构类:
collections模块中的namedtuple、defaultdict、deque、counter、ordereddict、ChainMap;
5.web重要类:requests 中的urllib、urllib2、urllib3(基于HTTP的重要模块)。

#time模块
    time.time() 时间戳1970至今的时间秒数,用于做计算;
    t=time.localtime()print(t.tm_year) 打印具体的年月日等;
    time.gmtime()  结构化时间 ;
    time.mktime()  将结构化时间转换为时间戳;
    time.strftime(%Y-%m-%d  %X”,time.localtime())--将结构化时间转换为字符串时间;
    time.strftime(2018:07:30:17:50:36,%Y:%m:%d:%X”)将字符串时间转换为结构化时间;
    time.asctime()/time.ctime() -设定好格式的时间表示(星期 月份 日期 时间  年);
    datetime.datetime.now() 显示年月日时分秒的样子;
#random模块
    random.random() 打印0-1的浮点数;
    random.randint(1,3)1,2,3
    random.rangrange(1,3)1,2
    random.choice([11,22,33])随机取出一个元素;
    random.sample([11,22,33],2)随机取出2个元素;
    random.uniform(1,3) 生成1-3中任意的浮点数;
    ramdom.shuffle(item) 打乱(洗牌);
#os模块
    os.getcwd()获取当前工作目录;
    os.chdir()改变当前工作目录;
    os.makedirs(‘name1/name2’建立多层目录);
    os.removedirs(“name1/name2”)删除文件(只删除空文件);
    os.listdir(“name1”)显示指定文件下的文件或目录;
    os.stat(“文件”)文件相关信息介绍;
    os.system(dir)显示当前文件信息;
    os.path.join(a,b)默认找出操作系统的拼接符,对a,b路径进行拼接;
    os.path.getmtime(path)获取path路径文件修改时间;
#sys模块
    sys.path  返回模块的搜索路径,初始化时使用pythonpath环境变量的值;
	sys.argv 命令行参数list,可以获取命令行输入的内容;
    sys.stdout.write(#’)往屏幕上显示 #####;
    sys.stdout.flush()刷新屏幕;
#re模块:正则表达式
        正则:元字符  . ^  $ * + ?  {}
        .:通配符,所有字符都可以匹配上,除了 \n;
         ^:以什么开头的意思,必须在字符串的开头匹配成功,只能在开头匹配;
         $:必须在字符串的末尾匹配,以匹配字符结尾;
         *:d*匹配紧挨字符的重复,0-无穷,紧挨着的字符可以出现0次;贪婪匹配
         +:匹配1-无穷次,即它挨着的字符至少出现一次;贪婪匹配
         ?:匹配0次或1次;惰性匹配
         { }:万能,,,{0} == *
                     {1}== +
                     {0,1} =={6}   重复6{1,6} 重复16中任意次数
         []:字符集;”x[yz]p” [‘xyp’,’xzp’],字符集[]中没有特殊符号,除外的 -(a-z表示范围);
            X[^a-z]非a-z的范围;
               \:转义字符(元字符变成普通字符,普通字符变得有意义);
               \d:匹配任何十进制数,相当于[0-9]
               \D:匹配任意非数字字符,相当于[^0-9]
               \s:匹配任何空白字符,相当于[\+\n\r\f\n]
               \S:匹配任何非空白字符,相当于[^ \+\n\r\f\n]
               \w:匹配任何字母数字字符,相当于[a-zA-Z0-9_]
               \W:匹配任何非字母数字字符,相当于[^ a-zA-Z0-9_]
               \b:匹配一个特殊字符边界,比如空格 &  #等;
               \特殊符号:将特殊符号转换成一般符号。
               |:或的意思。匹配 | 前面的或者后面的;
              ():分组,(abc)匹配abc为组的信息;
         re.findall(‘匹配规则’,‘被匹配字符串’),把字符串里面所有的能匹配到的结果,用列表展示出来(放到列表里);
         re.search():匹配字符串中的结果,只要能找到一个就不再匹配;匹配成功返回一个对象,失败返回空;
         re.search().group()-打印出匹配结果;
         re.match():匹配成功返回一个对象,失败也是空;只从开始匹配;
         re.split():根据特定字符 分割 ,返回列表;此处容易分出空的,是个坑。
        re.sub(匹配规则,替换内容,被替换内容,匹配次数),做替换,结果是字符串;
        re.subn(匹配规则,替换内容,被替换内容,匹配次数),做替换,结果放在一个元组里,并显示匹配次数;
        com = re.compile(‘\d+) com.findall(字符串)不用写匹配规则;编译匹配规则;
        re.finditer():将所有结果封装到一个迭代器,返回一个迭代器,不会将所有数据放到内存中,next()用一条取一条,取出来的也是一个对象;
#logging模块
 logging.basicConfig(level = logging.DEBUG,    设定日志级别
                     filename = “log.log”,      日志存储位置
                     filemode = “w”,          日志文件添加格式
                     format =%(asctime)s  [%(lineno)d]  %(message)s  %(filename)s”  显示格式(时间 行号 信息 文件名称)  
)
                     logging.debug(“debug”)
                     logging.info(“info”)
                     logging.warning(“waring”)
                     logging.error(“error”)
                     logging.critical(“critical”)
 #logger:
 #设置logger格式-----------------------------------------
       logger = logging.getLogger() :括号不加参数相当于根,加参数的话,相当于子用户,logger是一棵树,创建对象,子对象打印时会将父节点也执行一遍(当父节点在工作时)
       fh = logging.FileHandler()
       ch = logging.StreamHandler()
       fm = logger.Formatter(%(asctime)s  [%(lineno)d])
       fh.setFomatter(fm)  将内容格式放进来
       ch.setFormatter(fm)  将内容格式放进来
       logger.addHandler(fh)    往文件发送内容
       logger.addHandler(ch)    往屏幕发送内容
       logger.setLeval(“DEBUG”) 设定logger 日志级别
#调用logger----------------------------------------------    
       logger.debug(“hello”)
       logger.info(“hello”)
       logger.warning(“hello”)
       logger.error(“hello”)
       logger.critical(“helllo”)
#hashlib模块   提供摘要算法
#MD5, SHA1, SHA224, SHA256, SHA384, SHA512
      obj = hashlib.md5()
      obj.update(“root”,encode(“utf8”)) 将root转化成密文
      print(obj.hexdigest()) 打印密文内容

configparser 模块 配置文件
生成配置文件

生成结果

#config文件增删改查(类似字典操作)
    config.read(‘example.ini’)
    print(config.sections())打印config内容
    print(config.options()) 拿出键
    print(config.items()) 拿出键值对
    print(config.get()) 取出键下面对应键的值

10.python中常用的数据结构有哪些?

     (1)数字
     (2)字符串
     (3)列表[list]
     (4)元组(tuple)
     (5)字典{dict}
     (6)集合({set})

11.字典中哪些数据类型可以成为key值(或是满足了怎样的条件就可以成为字典的key值)?

凡是可哈希的数据结构都可以作为字典的键值。可哈希:一个对象在自己的生命周期中是不可变的(不可变的数据结构),则称该对象是可哈希的。字典的键值基本原则是唯一且不可变,其存储结构是一张哈希表,所以可哈希的对象都可以作为字典的键值。
数值、字符串、元组、frozenset(不可变集合)等都可以作为字典的键值;列表、字典、集合等不可以作为字典的键值。

12.如何创建多维列表

##(1)利用循环
A = [None] * 3
for i in range(3):
	A[i] = [None] * 2  ##==>[[None, None], [None, None], [None, None]]
##(2)使用列表推导式
w, h = 2, 3
A = [[None] * w for i in range(h)]##==>[[None, None], [None, None], [None, None]]

13.如何从列表中删除重复项

##(1)利用for循环
mylist = [12,'zf','dgd','dgd',12]
print(mylist)
sss = sorted(mylist)
print(sss)
last = mylist[-1]
for i in range(len(mylist)-1, -1, -1):
    if last == mylist[i]:
        del mylist[i]
    else:
        last = mylist[i]
print(mylist) ## ==> [12, 'zf', 'dgd']
## (2)利用集合
aa = list(set(mylist))
print(aa) ## ==> ['zf', 12, 'dgd']

14.如何按照其他列表中的值对一个列表进行排序

##将它们合并到元组的迭代器中,对结果列表进行排序,然后选择所需的元素。
list1 = ["what", "I'm", "sorting", "by"]
list2 = ["something", "else", "to", "sort"]
pairs = zip(list1, list2)
pairs = sorted(pairs)
print(pairs) ## ==>[("I'm", 'else'), ('by', 'sort'), ('sorting', 'to'), ('what', 'something')]
result = [x[0] for x in pairs]
print(result) ## ==>["I'm", 'by', 'sorting', 'what']
result = [x[1] for x in pairs]
print(result) ## ==>['else', 'sort', 'to', 'something']

15.PYTHON格式化输出实现方法

## 使用 %
print('%s' % 'hello world')  ## hello world
# 右对齐,取20位,不够则补位
print('%20s' % 'hello world') ##         hello world
# 左对齐,取20位,不够则补位
print('%-20s' % 'hello world') ##hello world         
# 取2位
print('%.2s' % 'hello world') ##he
# 右对齐,占位符10位,取2位
print('%10.2s' % 'hello world') ##        he
# 左对齐,占位符10位,取2位
print('%-10.2s' % 'hello world') ##he        
#默认保留6位小数
print('%f' %6.66) ## 6.660000
#保留1位小数
print('%.1f' %6.66) ## 6.7
#指定占位符宽度
print('name:%10s  age:%10d height:%10.6f' % ('xiaoming',26,1.89099000)) ##name:  xiaoming  age:        26 height:  1.890990
格式符描述
%s字符串(采用str()的显示)
%r字符串(采用repr()的显示)
%c单个字符及ascii码
%u整数
%b二进制整数
%o八进制数
%d十进制整数
%i十进制整数
%x十六进制数
%X十六进制数大写
%e指数 (基底写为e),用科学计数法格式化浮点数
%E指数 (基底写为E),作用同%e
%f浮点数,保留小数点后6位数字,可指定小数点后的精度
%g%f和%e的简写,指数(e)或浮点数 (根据显示长度)
%G%F和%E的简写,指数(E)或浮点数 (根据显示长度)
%p用十六进制数格式化变量的地址
%%转义,字符"%"
%10s右对齐,占位符10位
%-10s左对齐,占位符10位
%.2s10位占位符,截取两位字符串
%.3f保留3位小数位
## 使用format
"""
(1)不带参数,即{}
(2)带数字参数,可调换顺序,即{1}、{2}
(3)带关键字,即{a}、{b}
"""
# 不带参数
print('{} {}'.format('hello','world'))    # 结果:hello world
# 带数字参数
print('{0} {1}'.format('hello','world'))    # 结果:hello world
# 参数顺序倒乱
print('{0} {1} {0}'.format('hello','world'))    # 结果:hello world hello
# 带关键字参数
print('{a} {b} {a}'.format(b='hello',a='world'))    # 结果:world hello world
# 通过索引
coord = (3, 5)
print('X: {0[0]};  Y: {0[1]}'.format(coord))    # 结果:'X: 3;  Y: 5'
# 通过key键参数
a = {'a': 'test_a', 'b': 'test_b'}
print('X: {0[a]};  Y: {0[b]}'.format(a))    # 结果:'X: test_a;  Y: test_b'
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值