首页 > temp > 简明python教程 >
-
Python知识点(2)
49.递归求和
# 求1-100的和 # 方法一:归并、缩减reduce(需要导入functools的reduce包) from functools import reduce l = [i for i in range(101)] print(reduce(lambda x,y:x+y,l)) # 方法二:递归调用 def get_sum(num,max_num): if max_num >= num: res = max_num + get_sum(num,max_num-1) else: res=0 return res print(get_sum(1,100))
50.python字典和json字符串相互转化方法
import json d = {'a':1,'b':2,'c':3} # 字典转json j = json.dumps(d) # json转字典 j1 = json.loads(j) print(j) print(type(j)) print(j1) print(type(j1))
51.MyISAM 与 InnoDB 区别
- InnoDB支持事务,MyISAM不支持。事务是一种高级的处理方式,例如增删改时如果出了问题可以回滚还原,而MyISAM就不可以
- InnoDB支持外键,MyISAM不支持
- InnoDB删除表是一行行的删除,效率慢;MyISAM则是重建表
- InnoDB适合频繁修改和安全性较高的应用;MyISAM适合以查询和插入为主的应用
- InnoDB需要为有自增字段创建一个独立的索引;MyISAM可以和其他字段一起建立联合索引
52.用两种方法去空格
s = ' A B C ' # 方法一 s1 = s.split() print(''.join(s1)) # 方法二 s2 = s.replace(' ','') print(s2)
53.正则匹配不是以4和7结尾的手机号
import re mobile = ['13456774019','15988139634','13144447777'] for m in mobile: # 中括号内^表示非,除了的意思 get_mobile = re.findall('[^47]$',m) if get_mobile: print(m) else: print('%s不符合要求' %m)
54.简述python引用计数机制
python垃圾回收是以引用计数为主,标记-清除和分代清除为辅;标记-清除和分代回收主要是为了处理循环引用的难题。
引用计数算法:
当有一个变量保存了对象的引用时,此对象的引用计数就会+1,当使用del删除变量指向的对象时,如果对象的引用计数不为1,比如3,那么引用计数就会-1,变为2;再次del变量指向的对象时,
变为1,如果再调用一次del,才会真正删除对象。
55.列举3条以上PEP8编码规范
- 顶级定义之间空两行,比如函数或者类定义
- 方法定义、类定义与第一个方法之间应该空一行
- 三引号进行注释
- 使用Pycharm或者Eclipse一般使用4个空格来缩进代码
56.正则匹配中文
import re title = 'hello,你好,world,世界!' result = re.findall('[\u4e00-\u9fa5]+',title) print(result)
57.简述乐观锁和悲观锁
悲观锁:每次去拿数据的时候都会认为别人会修改,所以每次拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库很多就用到了这种锁机制,
比如,行锁,表锁,读锁,写锁等,都是操作之前先上一把锁。
乐观锁:每次去拿数据的时候都不认为别人会修改,所以每次拿数据都不会上锁,但是在更新的时候会判断一下在此期间有没有人更新数据,可以使用版本号等机制,乐观锁适用于多
读的应用类型,这样可以提高吞吐量。
58.正则表达式匹配出<html><h1>www.baidu.com</h1></html>
import re url = ['<html><h1>www.baidu.com</h1></html>','<html><h1>www.baidu.com</h2></html>'] for i in url: # \1\2表示反向引用,即\1匹配第一个()内匹配到的内容,\2匹配第二个()内匹配到的内容,以此类推 get_str = re.findall(r'<(\w+)><(\w+)>.+?</\2></\1>',i) if get_str: print(i) else: print('%s不符合要求'%i)
59.python传参数是传值还是传址?
python参数都是引用传递,对于不可变数据类型(字符、数值、元组),因为变量不能修改,所以函数体内的运算不会影响到变量自身;对于可变数据类型(列表、字典),函数体运算会更改传入的参数变量
60.求两个列表的交集、差集、并集
l1 = [2,4,6,6,8,9,3] l2= [4,2,2,6,8,8] # 交集 print(list(set(l1).intersection(set(l2)))) # 并集 print(list(set(l1).union(set(l2)))) # 差集 print(list(set(l1).difference(set(l2))))
61.生成0-100之间的随机数
import random # 随机整数 print(random.randrange(0,101,1)) # 随机整数 print(random.randint(0,101)) # 随机整数 print(random.choice(range(101))) # 随机小数,random.random()生成0-1之间的随机小数,所以乘以100 print(100*random.random())
62.lambda匿名函数的好处
精简代码,省去了定义函数
l = ['abc','cba','aaa','ccc'] # map省去了for循环 print(list(map(lambda i:'我饿了' if i == 'abc' else i,l)))
63.常见的网络传输协议
HTTP、FTP、TCP、UDP、SMTP等等
64.单引号、双引号、三引号的用法
单引号和双引号没什么区别,表示字符串的时候单引号里面可以嵌套双引号,反之亦然;如果单引号(或者双引号)里面再使用单引号(或双引号),则需要转义,即在每个嵌套引号前面加反斜杠(\)
三引号可以书写多行,通常用于大篇幅的字符串
65.HTTP请求中GET和POST的区别
- GET请求通过url直接访问,所以数据信息在url中可以直接看到,比如浏览器访问;而POST请求是放在请求头中的,无法直接看到
- 少量数据使用GET,大量数据使用POST
- GET请求的安全性比较低,比如密码是不能直接暴露在url中的,就不能使用GET请求,而POST请求是放在请求头中的,可以使用;一般涉及到登录密码操作的,最好使用HTTPS,安全性更好
66.读取Excel
# 导入应用数据分析库 import pandas file = pandas.read_excel('123.xls') print(file)
67.简述解释型和编译型编程语言
解释型语言编写的程序不需要编译,在执行的时候专门有一个解释器,把解释型语言编译成机器语言,每个语句都是在执行的时候才编译,每执行一次编译一次,效率比较低
编译型语言在执行程序之前,会有一个专门的编译过程,编译系统把源高级程序编译成机器语言文件,只需翻译一次,执行时不需要编译,所以编译型语言效率比较高
(简单来说就是:解释型语言在执行时编译,每次执行都要编译;编译型语言执行前编译,只需编译一次)
68.Python 的解释器种类以及相关特点
-
CPython
- 使用C语言开发,使用最广的解释器
-
IPython
- 基于Cpython之上的一个交互式计时器,交互方式增强,功能和CPython一样
-
PyPy
- 采用JIT技术,对python代码进行动态编译,提高执行效率
-
JPython
- 运行在Java上的解释器,把Python代码编译为Java字节码
-
IronPython
- 运行在微软.NET上的解释器,把Python代码编译为.NET字节码
69.字符串反转的几种方法
s = 'ilovechina' # plan1 切片 print(s[::-1]) # plan2 转换成列表反转 l = list(s) l.reverse() print(''.join(l)) # plan3 l2 = list(s) result = '' for _ in range(len(l2)): p = l2.pop() result += p print(result)
70.字符串编码转换
s = 'S' # 编码成二进制数据 bm = s.encode('gbk') print(bm) # 解码成二进制数据 jm = bm.decode('utf-8') print(jm)
71.打乱列表元素
import random l1 = [1,2,3,4,5,6] random.shuffle(l1) print(l1)
73.交换字典键值
# 方法一 字典生成式 d = {'name':'xiaoguo','age':18} d_new_1 = {v:k for k,v in d.items()} print(d_new) # 方法二 d_new_2 = dict() for k,v in d.items(): d_new_2[v] = k print(d_new_2) # 方法三 z = zip(d.values(),d.keys()) d_new_3 = dict(z) print(d_new_3)
74.我们知道对于列表可以使用切片操作进行部分元素的选择,那么如何对生成器类型的对象实现相同的功能呢?
# 导入itertools模块下的islice from itertools import islice # 斐波那切数列(前面两个数之和生成第三个数) def test(num): a,b = 0,1 while num > 0: a,b = b,a+b num -= 1 yield a for i in test(10): print(i) print('========================================================') # 普通生成器列表 for x in islice((i for i in range(10)),4,10): print(x)
75,生成器实现斐波那切数列
def test(num): a,b = 0,1 while num > 0: a,b = b,a+b num -= 1 yield a for i in test(10): print(i)
76.a="hello"和 b="你好"编码成 bytes 类型
a = 'hello' b = '你好' # 方法一 # 编码 en_1 = a.encode(encoding='utf-8') en_2 = b.encode(encoding='utf-8') print(en_1,en_2) # 解码 print(en_1.decode(),en_2.decode()) # 方法二 print(bytes(a,encoding='utf-8')) print(bytes(b,encoding='utf-8'))
77.在读文件操作的时候会使用 read、readline 或者 readlines,简述它们各自的作用
- read([size]):读取size个字节,没有参数表示读取到文件结束,输出的是字符串对象
- readline:读取一行内容,占用内存小,适合读取大文件,输出的是字符串对象
- readlines:读取文件所有行,保存在一个列表中,每行内容作为一个元素,读取大文件会比较占内存
78.json 序列化时,可以处理的数据类型有哪些?如何定制支持 datetime 类型?
可处理的数据类型:字符串(str)、整型(int)、布尔(bool)、列表(list)、元组(tuple)、字典(dict)、null
''' 序列化时间类型的数据 ''' import json from json import JSONEncoder from datetime import datetime class FormatTime(JSONEncoder): def default(self,obj): # 判断obj是否是datetime类型 # 如果是则格式化时间 if isinstance(obj,datetime): return obj.strftime('%Y-%m-%d %H:%M:%S') else: # 否则是其他类型的数据,调用父类默认的default方法 return JSONEncoder.default(obj) d = {'name':'gy','time':datetime.now()} get_time = json.dumps(d,cls=FormatTime) print(get_time)
79.json 序列化时,默认遇到中文会转换成 unicode,如果想要保留中文怎么办?
import json d = {'words':'你好'} print(json.dumps(d,ensure_ascii=False))
80.如果当前的日期为 20190530,要求写一个函数输出 N 天后的日期,(比如 N 为 2,则输出 20190601)
from datetime import timedelta from datetime import datetime def get_date(date_time,n): # 将字符串对象转换为时间格式对象,注意传入的字符串格式必须要个格式化的格式一样 format_time = datetime.strptime(date_time,'%Y%m%d') if isinstance(n,int): # datetime.timedelta:时间间隔,参数可以是days、hours等,以此类推 new_date = (format_time + timedelta(days=n)).strftime('%Y%m%d') return new_date else: return('输入的条件不符合要求') print(get_date('20161120',10))
81..写一个函数,接收整数参数 n,返回一个函数,函数的功能是把函数的参数和 n 相乘并把结果返回
# 闭包结构的调用 def a(m): def b(n): return m*n return b a1 = a(3) a1(2)
82.请写一段 Python连接 Mongo 数据库,然后的查询代码
import pymongo db_config = { "type":"mongo", "host":"主机地址", "post":"端口号", "username":"用户名", 'passwd':"密码", "db_name":"数据库名称" } class Mongo(): def __init__(self): self.db = db_config["db_name"] self.uname = db_config["username"] self.passwd = db_config["passwd"] # 字符串前面加f 表示支持字符串中大括号内的表达式 self.client = pymongo.MongoClient(f'mongodb://{db_config["host"]}:db_config["port"]') if self.uname and self.passwd: self.db1 = self.client[self.db].authenticate(self.uname,self.passwd) self.db1 = self.client[self.db] def get_data(self): # 查询状态为0的数据 data = self.db1.find({"status":"0"}) gen = (i for i in self.data) return gen m = Mongo() print(m.get_date())
83.Redis数据类型
redis指出五种数据类型:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)
84.请写一段 Python连接 Redis 数据库的代码
import redis # redis默认端口号是6379 conn = redis.Redis(host="localhost",port="6379",decode_response="True") # 将键值存入redis缓存 conn.set('name','zhangsan') print(conn['name']) # 取出键对应的值 print(conn.get('name'))