Python的list和dict线程安全吗
Python的值类型和引用类型是哪些
Python的GIL锁本质上做了什么事情
Python多进程和多线程如何选择
python的三目运算符

1
2
3
4
watch = 4
incement = 8
conv = (0 if (watch == 0) else incement / watch)
print(conv)
  1. dict实现 扩容机制 2. weakref 3. celery内存泄漏 4. MySQL索引失效 5. 间隙锁 如何解决幻读 6. 慢查询 7.python内存管理 8. 野指针 9. MySQL bigint大小 10. MySQL5.7 8.0区别 11.redis持久化 12. cow 持久化流程 13. 内核优化 14.大数据量优化 15. 归并算法 布隆过滤器 flask底层流程 nginx-gunicorn-python关系 16. mq四种类型转换 dockerfile 为什么用&代替run docker对内存的限制 wigi asgi区别 17. requests线程安全问题
    ng穿透 多个ng漂移如何获取真实ip 100g文件2g内存处理文件 http各版本区别 bitmap算法 跳台阶算法 lru实现

Python有可变类型和不可变类型,传递的时候都是引用传递。只是不可变类型的值是不能发生改变的,所以看起来像是值传递。本质就是引用传递

#1、十转二
将十进制转换为二进制

1
2
print(bin(10))
#0b1010

#2、十转八
十进制转换为八进制:

1
2
print(oct(9))
#0o11

#3、十转十六
十进制转换为十六进制:

1
2
print(hex(15))
#0xf

#4、字符串转字节
字符串转换为字节类型

1
2
3
s = "apple"
print(bytes(s,encoding='utf-8'))
#b'apple'

#5、转换为字符串
字符类型、数值型等转换为字符串类型

1
2
3
i = 100
print(str(i))
#100

#6、十转ASCII
十进制整数对应的 ASCII 字符

1
2
print(chr(65))
#A

#7、ASCII转十
ASCII字符对应的十进制数

1
2
print(ord('a'))
#97

#8、转为字典
创建数据字典的几种方法

1
2
3
4
5
6
7
8
print(dict())
#{}
print(dict(a = "a",b = 'b'))
#{'a': 'a', 'b': 'b'}
print(dict(zip(['a','b'],[1,2])))
#{'a': 1, 'b': 2}
print(dict([('a',1),('b',2)]))
#{'a': 1, 'b': 2}

#9、转为浮点类型
整数或数值型字符串转换为浮点数

1
2
print(float(1))
#1.0

#10、转为整型
int(x, base=10)
x可能为字符串或数值,将x转换为整数
如果参数是字符串,那么它可能包含符号和小数点。如果超出普通整数的表示范围,一个长整数被返回。

1
2
3
4
5
print(int('16',16))
#22
# 把前面字符串内容转换成后面的进制
print(int('0xc',16))
#12

#11、转为集合
返回一个 set 对象,集合内不允许有重复元素:

1
2
3
a = [1,4,2,3,1]
print(set(a))
#{1, 2, 3, 4}

#12、转为切片
class slice(start, stop[, step])
返回一个由range(start, stop, step)指定索引集的slice对象,代码可读性变好。

1
2
3
4
5
a = [1,4,2,3,1]
#slice切片一个范围截取3个元素,0-2之间
my_slice = slice(0,3,2)
print(a[my_slice])
#[1, 2]

Python学习的十个阶段

阶段一:Python开发基础

Python全栈开发与人工智能之Python开发基础知识学习内容包括:Python基础语法、数据类型、字符编码、文件操作、函数、装饰器、迭代器、内置方法、常用模块等。

阶段二:Python高级编程和数据库开发

Python全栈开发与人工智能之Python高级编程和数据库开发知识学习内容包括:面向对象开发、Socket网络编程、线程、进程、队列、IO多路模型、Mysql数据库开发等。

阶段三:前端开发

Python全栈开发与人工智能之前端开发知识学习内容包括:Html、CSS、JavaScript开发、Jquery&bootstrap开发、前端框架VUE开发等。

阶段四:WEB框架开发

Python全栈开发与人工智能之WEB框架开发学习内容包括:Django框架基础、Django框架进阶、BBS+Blog实战项目开发、缓存和队列中间件、Flask框架学习、Tornado框架学习、Restful API等。

阶段五:爬虫开发

Python全栈开发与人工智能之爬虫开发学习内容包括:爬虫开发实战。

阶段六:全栈项目实战

Python全栈开发与人工智能之全栈项目实战学习内容包括:企业应用工具学习、CRM客户关系管理系统开发、路飞学城在线教育平台开发等。

阶段七:数据分析

Python全栈开发与人工智能之数据分析学习内容包括:金融量化分析。

阶段八:人工智能

Python全栈开发与人工智能之人工智能学习内容包括:机器学习、图形识别、无人机开发、无人驾驶等。

阶段九:自动化运维&开发

Python全栈开发与人工智能之自动化运维&开发学习内容包括:CMDB资产管理系统开发、IT审计+主机管理系统开发、分布式主机监控系统开发等。

阶段十:高并发语言GO开发

Python全栈开发与人工智能之高并发语言GO开发学习内容包括:GO语言基础、数据类型与文件IO操作、函数和面向对象、并发编程等。

2019最新Python全栈工程师学习路线(初级+高级+大神)

IT行业,技术要比学历、年龄、从业经验更为重要,技术水平直接决定就业薪资,想要学好python,首先要先了解精通Python语言基础、Python web开发、Python爬虫、Python数据分析这四大方面。

零基础学习需要要从如下几个阶段入手:

阶段一:熟练掌握Python多线程并发编程技术,可以编写爬虫程序和语音识别软件

阶段二:熟练掌握Linux操作系统管理技术,可以搭建几乎所有Linux环境服务器

阶段三:掌握三大Python后端框架,解决一切前后端Web开发问题

阶段四:掌握三大Python后端框架,解决一切前后端Web开发问题

阶段五:Web框架之Tornado

阶段六:docker容器及服务发现

阶段七:掌握分布式多线程大型爬虫技术,能开发企业级爬虫程序

阶段八:成为Python数据挖掘分析师,进入人工智能领域,成为IT市场最前沿人才

Python学习路线详细知识点如下:

python语言基础

Python3入门,数据类型,字符串,判断/循环语句,函数,命名空间,作用域,类与对象,继承,多态,tkinter界面编程,文件与异常,数据处理简介

python语言高级

Python常见第三方库与网络编程,Python正则表达式,邮箱爬虫,文件遍历,金融数据爬虫,多线程爬虫,Python线程、进程,Python MySQL数据库,协程,jython

python全栈工程师前端

HTML,HTML5,CSS,CSS3,网页界面设计实战,javaScript,jquerry,jquerry EasyUI, Mobile简介,photoshop,Bootstrap

python全栈工程师后端

Django入门,Django高级,Django实战,Python高级开发工程师学习路线

python全栈工程师后端高级

Flask开发原理,Flask开发项目实践,Tornado开发原理,Tornado开发项目实践

Linux基础

文件处理命令,权限管理命令,帮助命令,文件搜索命令,压缩解压命令,命令使用技巧,VIM使用,软件包管理,用户和用户组管理,Linux Shell开发

Linux运维自动化开发

Python开发Linux运维,Linux运维报警工具开发,Linux运维报警安全审计开发,Linux业务质量报表工具开发,Kali安全检测工具检测,Kali 密码破解实战,Python大神级数据分析师学习路线

python数据分析

numpy数据处理,pandas数据分析,matplotlib数据可视化,scipy数据统计分析,python 金融数据分析

python大数据

Hadoop HDFS,python Hadoop MapReduce,python Spark core,python Spark SQL,python Spark MLlib

python机器学习

机器学习基础知识简介,KNN算法,线性回归,逻辑斯蒂回归算法,决策树算法,朴素贝叶斯算法,支持向量机,聚类k-means算法。

地址:https://mp.weixin.qq.com/s/DlD64oec7P-rNIFoN6DN1g
##1.一行代码实现1-100之和
利用sum函数求和
print(sum(range(1,101)))

##2.在一个函数内部修改全局变量
a = 2
def fn():
global a
a = 4
fn()
print(a)

##3、列出5个python标准库
os:提供了不少与操作系统相关联的函数
sys: 通常用于命令行参数
re: 正则匹配
math: 数学运算
datetime:处理日期时间

##4.字典如何删除键和合并两个字典
del 和 updata方法
dic = {‘name’:’fa’,’age’:18}
del dic[‘name’]
print(dic)

dic2 = {‘name’:’fy’}
dic.update(dic2)
print(dic)

##5、谈下python的GIL
GIL 是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。
多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大。

##6、python实现列表去重的方法
先通过集合去重,再转列表
list = [8,1,2,3,4,1,2,6,7]
a = set(list)
print(a)

s = [x for x in a]
print(s)

##7、fun(*args,*kwargs)中的args,**kwargs什么意思?
args和**keargs主要用于函数定义,你可以将不定数量的参数传递给一个函数,这个不定的意思是:预先并不知道,函数使用者会传递多少个参数给你,所以在这个场景下使用这两个关键字。args是用来发送一个非键值对的可变数量的参数列表给一个函数。
def demo(args_f,*args_v):
print(‘–’,args_f)
for x in args_v:
print(x)
print(demo(‘a’,’b’,’c’,’d’,’e’))

kwargs允许你将不定长度的键值对,作为参数传递给一个函数。如果你想要在一个函数里处理带名字的参数,你应该使用kwargs。
def demo(**args_v):
for k,v in args_v.items():
print(k,v)

print(demo(names = ‘fafy’))

##8、python2和python3的range(100)的区别
python2返回列表,python3返回迭代器,节约内存

##9、一句话解释什么样的语言能够用装饰器?
函数可以作为参数传递的语言,可以使用装饰器

##10、python内建数据类型有哪些?
整型–int
布尔型–bool
字符串–str
列表–list
元组–tuple
字典–dict

##11、简述面向对象中__new__和__init__区别
__init__是初始化方法,创建对象后,就立刻被默认调用了,可接收参数
class Bike:
def init(self,newWheelNum,newColor):
self.wheelNum = newWheelNum
self.color = newColor

def move(self):
    print('测试')

BM = Bike(2,’black’)

print(‘测试颜色:%s’%BM.color)
print(‘测试数量:%d’%BM.wheelNum)

1、__new__至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别
2、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类(通过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出来的实例
3、__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值
4、如果__new__创建的是当前类的实例,会自动调用__init__函数,通过return语句里面调用的__new__函数的第一个参数是cls来保证是当前类实例,如果是其他类的类名,;那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数。

class A(object):
def init(self):
print(‘init方法’,self)

def __new__(cls):
    print('cls的ID',id(cls))
    print('new方法',object.__new__(cls))
    return object.__new__(cls)

A()
print(‘类A的ID’,id(A))

##12、简述with方法打开处理文件帮我我们做了什么?
f = open(‘D:\fafytest\python1\1.txt’,’wb’)
try:
f.write(‘hello world’)
except:
print(‘else’)
finally:
print(‘fin’)
f.close()
打开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的f.open
写法,我们需要try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行finally f.close()关闭文件,with方法帮我们实现了finally中f.close

##13、列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25]
map()函数第一个参数是fun,第二个参数是一般是list,第三个参数可以写list,也可以不写,根据需求
lis = [1,2,3,4,5]

def fn(x):
return x**2
res = map(fn,lis)
print(res)

res = [i for i in res if i > 10]
print(res)

##14、python中生成随机整数、随机小数、0–1之间小数方法
随机整数:random.randint(a,b),生成区间内的整数
随机小数:习惯用numpy库,利用np.random.randn(5)生成5个随机小数
0-1随机小数:random.random(),括号中不传参

import random
import numpy as np
result = random.randint(5,15)
res = np.random.randn(5)
ret = random.random()
print(‘正整数’,result)
print(‘5个随机小数’,res)
print(‘0-1随机小数’,ret)

##15、避免转义给字符串加哪个字母表示原始字符串?
r , 表示需要原始字符串,不转义特殊字符

##16、

中国
,用正则匹配出标签里面的内容(“中国”),其中class的类名是不确定的
import re
st = ‘
中国

res = re.findall(r’<.?>(.?)<.*?>’,st)
print(res)

##17、python中断言方法举例
assert()方法,断言成功,则程序继续执行,断言失败,则程序报错
a =3
assert (a > 1)
print(‘断言成功,程序继续向下执行’)

b = 4
assert (b > 6)
print(‘断言失败,程序报错’)

##18、数据表student有id,name,score,city字段,其中name中的名字可有重复,需要消除重复行,请写sql语句
select distinct name from student

##19、10个Linux常用命令
ls pwd cd touch rm mkdir tree cp mv cat more grep echo

##20、python2和python3区别?列举5个
1、Python3 使用 print 必须要以小括号包裹打印内容,比如 print(‘hi’)
Python2 既可以使用带小括号的方式,也可以使用一个空格来分隔打印内容,比如 print ‘hi’
2、python2 range(1,10)返回列表,python3中返回迭代器,节约内存
3、python2中使用ascii编码,python中使用utf-8编码
4、python2中unicode表示字符串序列,str表示字节序列
python3中str表示字符串序列,byte表示字节序列
5、python2中为正常显示中文,引入coding声明,python3中不需要
6、python2中是raw_input()函数,python3中是input()函数

##21、列出python中可变数据类型和不可变数据类型,并简述原理
不可变数据类型:数值型、字符串型string和元组tuple
不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象(一个地址),如下图用id()方法可以打印对象的id
a = 3
b = 3
print(id(a))
print(id(b))

可变数据类型:列表list和字典dict;
允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。
a = [1,2]
b = [1,2]
print(id(a))
print(id(b))

##22、s = “ajldjlajfdljfddd”,去重并从小到大排序输出”adfjl”
set去重,去重转成list,利用sort方法排序,reeverse=False是从小到大排
list是不 变数据类型,s.sort时候没有返回值,所以注释的代码写法不正确
s = “ajldjlajfdljfddd”
s= set(s)
s=list(s)
s.sort(reverse=False)
res = ‘’.join(s)
print(res)

##23、用lambda函数实现两个数相乘
s = lambda x,y:x*y
print(s(2,3))

###1.线程的状态有哪些?创建一个线程的常用方法有哪些?
第一是创建(New)状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
第二是就是(Runnable)状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
第三是运行(Running)状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
第四是阻塞(Blocked)状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程堵塞。
第五是死亡(Terminated)状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。
一、继承Thread类创建线程子类:
1.在这子类中重写run方法,在run方法内写线程任务代码。
2.创建该子类实例,即是创建了一个线程实例。
3.调用该实例的start方法来启动该线程。
二、建一个类去实现Runnable接口:
1.该类去实现接口的run方法。run方法内写线程任务代码。
2.创建该实例,把该实例当作一个标记target传给Thread类,如:Thread t = new Thread(该类实例):即是创建一个线程对象。
3.调用线程的start方法来启动该线程


###2.值传递和引用传递的区别和联系:
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。


###3.阐述你对构造函数以及常量的理解?
构造函数是类在实例化成对象时用来做一些事情,而这些事情是该对象被创建时必须做的事。例如初始化属性,但不限于此。另外我们可以对构造函数进行重载,是让我们在类的实例化时能够更多元化。
简单的说,用final修饰过的变量就叫常量,常量一旦定义了就不允许被修改。往大的说,定义常量,是不想让某些固定的属性或方法被调用后改变了值,或者被集成后重写。往底层说,常量存放在常量池里,在类加载之前就已经被加载,且不会改变。


###4.List、Map、Set三个接口,存取元素时,各有什么特点?
List以特定次序来持有元素,可有重复元素。即,有序可重复。
访问时可以使用for循环,foreach循环,iterator迭代器 迭代。
Set无法拥有重复元素,内部排序。即,无序不可重复。
访问时可以使用foreach循环,iter迭代器 迭代。
Map保存key-value值,一一映射。key值是无序,不可重复的。value值可重复。
访问时可以map中key值转为为set存储,然后迭代这个set,用map.get(key)获取value


###5.请写出string stringbuffer stringbuilder的区别:
1.可变与不可变
String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。
StringBuilder与StringBuffer都继承自AbstracStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。
2.是否多线程安全
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以线程安全的。
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。


###6.写出一个单例类(Singleton):
1.饥汉式单例

public class Singleton{
   private Singleton(){};
   private static Singleton instance = new Singleton();
   public static Singleton getInstance(){
       return instance;

   }
}

2.懒汉式单例

public class Singleton{
   private Singleton(){};
   private static Singleton instance = null;
   public static synchronized Singleton getInstance(){
      return instance == null?new Singleton():instance;
   }
}