python面试题

 

 

1. 基础题

#-----2020-02-20------#

'''
#ip地址转整数
def v(addr):
  id=[int(x)for x in addr.split('.')]
  s=sum(id[i]<<[24,16,8,0][i] for i in range(4))
  print(s)
v('127.0.0.1')

#拷贝
import copy

# 浅拷贝
li1 = [1, 2, 3]
li2 = li1.copy()
li1.append(4)
print(li1, li2) # [1, 2, 3, 4] [1, 2, 3]

# 深拷贝
li1 = [1, 2, 3]
li2 = copy.deepcopy(li1)
li1.append(4)
print(li1, li2) # [1, 2, 3, 4] [1, 2, 3]


# 浅拷贝 指向共有的地址
li1 = [1, 2, 3, [4, 5], 6]
li2 = li1.copy()
li1[3].append(7)
print(li1, li2) # [1, 2, 3, [4, 5, 7], 6] [1, 2, 3, [4, 5, 7], 6]

# 深拷贝 重指向
li1 = [1, 2, 3, [4, 5], 6]
li2 = copy.deepcopy(li1)
li1[3].append(7)
print(li1, li2) # [1, 2, 3, [4, 5, 7], 6] [1, 2, 3, [4, 5], 6]

#现有两个元组(('a'),('b')),(('c'),('d')),请使用python匿名函数生成列表[{'a':'c'},{'b':'d'}]

#匿名函数形式:
li1=(('a'),('b'))
li2=(('c'),('d'))
li3=(('1'),('2'),('3'))
#zip:将对象中对应的元素打包成一个个元组,返回一个对象,其列表长度与最短的对象相同
print(list(zip(li1,li2,li3)))
# map(function, iterable, ...)
ret=map(lambda n:{n[0]:n[1]},zip(li1,li2))
print(list(ret))
#列表表达式形式:
li1=(('a'),('b'))
li2=(('c'),('d'))
print([{n[0]:n[1]} for n in zip(li1,li2)])


v = dict.fromkeys(['k1', 'k2'], [])
v['k1'].append(666)
print(v)#{'k1': [666], 'k2': [666]}

#Python字典(Dictionary)fromkeys()函数用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值,默认为None。

v1 = dict.fromkeys(['k1', 'k2'])
print(v1) # {'k1': None, 'k2': None}

v2 = dict.fromkeys(['k1', 'k2'], [])
print(v2) # {'k1': [], 'k2': []}

#print(( i % 2 for i in range(10) ))
# <generator object <genexpr> at 0x00000000020CEEB8> 生成器
# 在Python中,有一种自定义迭代器的方式,称为生成器(Generator)。
# 定义生成器的两种方式:
# 1.创建一个generator,只要把一个列表生成式的[]改成(),就创建了一个generator:
# generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,
#没有更多的元素时,抛出StopIteration的错误。
# 2.定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,
#而是一个generator

ef foo():
  m=3
  n=5
  def bar():
      a=4
      return m+n+a
  return bar

#bar在foo函数的代码块中定义。我们称bar是foo的内部函数。
#在bar的局部作用域中可以直接访问foo局部作用域中定义的m、n变量。
#简单的说,这种内部函数可以使用外部函数变量的行为,就叫闭包

import copy
list1=[1,2,3]
list2=list1
list1[1]=4
print(list2)


#or 从左到右,返回第一个为真的值,都为假返回后一个值
#and 从左到右,若所有值均为真,则返回后一个值,有一个假的值,则返回第一个假的值
v1=1 or 3
v2=10 and 3
print(v1,v2)

#函数内改变函数外的变量:global声明全局变量
n=3
def f():
  global n
  n=4
f()
print(n)

#闭包:内嵌函数引用外层函数的变量,闭包函数返回内嵌函数的地址(函数名称)
def fo():
  n=5
  def fi():
      #n=n+1只可引用,不可修改
      print('fi',n+1)
  print(n)
  print(bool(fi.__closure__))
  return fi

f=fo()
print(bool(f.__closure__))
f()

#装饰器
#本质:闭包
#作用:在不修改原函数及其调用方式的情况下对原函数功能进行扩展
#eg:为现有函数f1增加日志功能
#使用闭包
def f1():
  print('我是f1')
def outf(func):
  def inf():
      func()
      print('写日志')
  return inf
f1=outf(f1)
f1()

#使用装饰器(语法糖)
def outf(func):
  def inf():
      func()
      print('写日志')
  return inf
@outf
def f1():
  print('我是f1')
f1()

#多个装饰器
def d1(func):
  print('装饰器1即将装饰:')
  def d():
      return func()+" 1正在装饰 "
  return d
def d2(func):
  print('装饰器2即将装饰:')
  def d():
      return func()+" 2正在装饰 "
  return d

@d2
@d1
def f1():
  return ' 我是毛坯房 '
print(f1())

#通用装饰器
def func(fn):
  # 需要有参数,*args,**kwargs
  def func_in(*args,**kwargs):# args:非键值参数   kwargs:键值参数
      print("记录日志")
      print('访问方法:'+fn.__name__)
      # 需要有参数,*args,**kwargs
      xx = fn(*args,**kwargs)
      # 需要有返回值
      return xx
  return func_in
@func
def test(n,str):
  print(n,str)
test(3,'hi')

# 类方法静态方法

# 静态方法:
# 1.格式:在方法上面添加 @staticmethod
# 2.参数:静态方法可以有参数也可以无参数
# 3.应用场景:一般用于和类对象以及实例对象无关的代码。
# 4.使用方式: 类名.类方法名(或者对象名.类方法名)
# 使用示例: 学生管理系统的展示主菜单

# 类方法:
# 无需实例化,可以通过类直接调用的方法,但是方法的第一个参数接收的一定是类本身
# 1.在方法上面添加@classmethod
# 2.方法的参数为 cls 也可以是其他名称,但是一般默认为 cls
# 3.cls 指向 类对象(也就是 Goods)
# 4.应用场景:当一个方法中只涉及到静态属性的时候可以使用类方法(类方法用来修改类属 性)。
# 5.使用 可以是 对象名.类方法名。或者是 类名.类方法名
class Goods():
  count=1
  def __init__(self,name,price):
      self.name=name
      self.price=price
  def discount(self):
      return self.price*self.count
  @classmethod
  def changcount(cls,new_count):
      cls.count=new_count
print(Goods.count)
Goods.changcount(3)
print(Goods.count)

#正则表达式
#字符串前加r表示原始字符
s='hi\nhi'
s1=r'hi\nhi'
print(s,s1)
'''
import re
# Compile:Compile a regular expression pattern into a regular expression object,
# which can be used for matching using its match(), search() and other methods, described below.
# 元字符
# .匹配除换行符以外的任意字符
# \w匹配字母或数字或下划线或汉字
# \s匹配任意的空白符
# \d匹配数字
# \b匹配单词的开始或结束
# ^匹配字符串的开始
# $匹配字符串的结束
str1='ihiaelloawihi #2010@中国!'
r1=re.compile('hi.*\d')
s2=r1.search(str1)
s3=re.match('hi.*\d',str1)

print(s2.group())
print(s3)
#限定符
# * 重复零次或更多次
# + 重复一次或更多次
# ? 重复零次或一次
# {n} 重复n次
# {n,} 重复n次或更多次
# {n,m} 重复n到m次
str2='12345'
r2=re.compile('^\d{3,5}$')#输入必须是3到5个数字
print(r2.search(str2))
# []匹配其中的任意一个字符
# [aeiou]匹配任何一个英文元音字母
# [a-z0-9A-Z_]==\w
# eg:\(?0\d{2}[) -]?\d{8},这个表达式可以匹配几种格式的电话号码,
# 像(010)88886666,或022-22334455,或02912345678等。
# 我们对它进行一些分析吧:首先是一个转义字符\(,它能出现0次或1次(?),
# 然后是一个0,后面跟着2个数字(\d{2}),
# 然后是)或-或空格中的一个,它出现1次或不出现(?),最后是8个数字(\d{8})
# 分枝条件
# 表达式也能匹配010)12345678或(022-87654321这样的“不正确”的格式。
# 分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,
# 具体方法是用|把不同的规则分隔开
# \(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}
str3='qa010-12345678'
r3=re.compile('\(?0\d{2}[)-]?\d{8}')
r4=re.compile('\(0\d{2}\)\d{8}|0\d{2}-\d{8}')
print(r3.search(str3))
print(r4.search(str3))

# 分组:()小括号指定分组
# eg:ip地址 (\d{1,3}\.){3}\d{1,3}
str4='127.27.0.100'
r5=re.compile('(\d{1,3}\.){3}\d{1,3}')
r6=re.compile('((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)')
print(r5.search(str4))
print(r6.search(str4))

# 反义
# \W匹配任意不是字母,数字,下划线,汉字的字符
# \S匹配任意不是空白符的字符
# \D匹配任意非数字的字符
# \B匹配不是单词开头或结束的位置
# [^x]匹配除了x以外的任意字符
# [^aeiou]匹配除了aeiou这几个字母以外的任意字符

# 贪婪与懒惰匹配
# 包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符
# 懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?
str5='aabab'
r6=re.compile('a.*b')
r7=re.compile('a.*?b')
print(r6.search(str5))#aabab
print(r7.search(str5))#是aab,不是ab,最先开始的匹配拥有最高的优先权

2. 网络编程

3. 人工智能

posted @ 2020-03-26 18:26  幻影如梦  阅读(123)  评论(0)    收藏  举报