机器学习深度学习面试题——Python基础知识
提示:
python 深拷贝与浅拷贝
python多线程能用多个cpu么?
python垃圾回收机制
python里的生成器是什么
迭代器和生成器的区别
装饰器
python有哪些数据类型
Python 中列表( List )中的 del,remove,和 pop 等的用法和区别
python yeild 和return的区别
python set底层实现
python字典和set()的区别
怎么对字典的值进行排序?
init和new和call的区别
import常用库
python的lamda函数
Python内存管理
python在内存上做了哪些优化?
Python中类方法和静态方法的区别
python多线程怎么实现
点积和矩阵相乘的区别?
Python中错误和异常处理
Python 的传参是传值还是传址?
什么是猴子补丁?
当退出 Python 时是否释放所有内存分配?
Python 中的 is 和 == 有什么区别?
gbk和utf8的区别
遍历字典可以用什么方法
反转列表的方法
python 元组中元组转为字典
range在python2和python3里的区别
init.py 文件的作用以及意义
python的字符串的加法和乘法操作
python 元组骚操作
python 集合set骚操作
python 字典dict骚操作
pyhton 字符串骚操作
python 字符串和数字转换
python格式化字符串
python操作字符串,拼接,删除,查找,替换等
python的函数定义调用
python函数的变量问题
python函数类型,函数嵌套
python过滤函数filter()
python的映射函数map()
python的lambda函数
本文还有后续第2篇,因为本文太长不变读者阅读,所以就开了第2篇:
(2)机器学习深度学习面试题——Python基础知识第2篇,续第1篇
(1)面向对象的python类
(2)python对象的继承性
(3)python对象的多态性
(4)python的异常处理
(5)python的模块:数学计算模块,时间模块
(6)python的正则表达式模块
(7)python文件读写操作
文章目录
机器学习深度学习面试题——Python基础知识@[TOC](文章目录)python的lambda函数python的映射函数map()python过滤函数filter()python函数类型,函数嵌套python函数的变量问题python的函数定义调用python操作字符串,拼接,删除,查找,替换等python格式化字符串python 字符串和数字转换pyhton 字符串骚操作python 字典dict骚操作python的集合骚操作:python 元组骚操作python 深拷贝与浅拷贝python多线程能用多个cpu么?python垃圾回收机制python里的生成器是什么迭代器和生成器的区别装饰器python有哪些数据类型Python 中列表( List )的各种操作,比如 del,remove,和 pop 等的用法和区别python yeild 和return的区别python set底层实现python字典和set()的区别怎么对字典的值进行排序?init和new和call的区别import常用库python的lamda函数Python内存管理python在内存上做了哪些优化?Python中类方法和静态方法的区别python多线程怎么实现点积和矩阵相乘的区别?Python中错误和异常处理Python 的传参是传值还是传址?什么是猴子补丁?当退出 Python 时是否释放所有内存分配?Python 中的 is 和 == 有什么区别?gbk和utf8的区别遍历字典可以用什么方法反转列表的方法python 元组中元组转为字典range在python2和python3里的区别__init__.py 文件的作用以及意义python的字符串的加法和乘法操作切片操作python中的成员测试:判断x在其中吗?总结
python的lambda函数
def calc(opr):if opr == '+':return lambda a, b : (a + b)else:return lambda a, b : (a - b) # 替代加减函数f1 = calc('+')f2 = calc('-')print(f1(10, 5))print(f2(10, 5))
155
lambda只能有一行代码;一条语句,可以多调用别的函数
python的映射函数map()
def f2(x):return 2 * xdata = [1,2,3,4,5]data2 = map(f2, data) # 从data中过滤print(type(data2))print(list(data2))
<class 'map'>[2, 4, 6, 8, 10]
python过滤函数filter()
经过f1过滤后,返回满足条件的剩下的元素
# coding=utf-8def moreThan(x):return x > 2data = [1,2,3,4,5]data2 = filter(moreThan, data) # 从data中过滤print(type(data2))print(list(data2))
结果:
<class 'filter'>[3, 4, 5]
python函数类型,函数嵌套
# coding=utf-8def add(a, b):return a + bdef sub(a, b):return a - bdef square(a):return a * adef calc(opr):if opr == '+':return addelse:return subf1 = calc('+');f2 = calc('-');print(type(f1))print(type(f2))print("10+5={0}".format(f1(10, 5)))print("10-5={0}".format(f2(10, 5)))
发现,函数确实可以作为返回值
<class 'function'><class 'function'>10+5=1510-5=5
python函数的变量问题
全局外部用,内部局部变量
global x在局部把x变为全局变量了。
python的函数定义调用
可变参数,没有数量限制
*a是元组
星星a是字典
python操作字符串,拼接,删除,查找,替换等
>>> s = 'a b c d'>>> s.replace(' ', '|', 1)'a|b c d'>>> s.replace(' ', '|', 2)'a|b|c d'>>> s.replace(' ', '|')'a|b|c|d'
>>> s.split(' ', 0)['a b c d']>>> s.split(' ', 1)['a', 'b c d']>>> s.split(' ', 2)['a', 'b', 'c d']>>> s.split(' ')['a', 'b', 'c', 'd']
python格式化字符串
python 字符串和数字转换
>>> int("90")90>>> float('90.1')90.1>>> int('AB')Traceback (most recent call last):File "<stdin>", line 1, in <module>ValueError: invalid literal for int() with base 10: 'AB'>>> int('AB', 16)171
>>> str(123)'123'
pyhton 字符串骚操作
单引号和双引号都一样:与java和c++不同的
上面是转义字符,所有语言的转义字符差不多。
r是我们编代码经常用的,因为咱们的文件路径需要表示\
>>> s = 'hello\n world'>>> s'hello\n world'>>> s1 =r'hello\n world'>>> s1'hello\\n world'
三重单引号
三重双引号
我还是第一次见
>>> s = '''... 母亲节 5月8日 星期日...... 母亲节(Mother's Day),是一个感谢母亲的节日。现代 的母亲节起源于美国,是每年5月的第二个星期日。... '''>>> s"\n母亲节 5月8日 星期日\n\n母亲节(Mother's Day),是一个感谢母亲的节日。现代的母亲节起源于美国,是每年5月的第二个星期日。\n">>> print(s)母亲节 5月8日 星期日母亲节(Mother's Day),是一个感谢母亲的节日。现代的母 亲节起源于美国,是每年5月的第二个星期日。
python 字典dict骚操作
键值对:
大括号中包含键值对就可以
上面的方法1创建:
>>> dict({1:'a',2:'b',3:'c'}){1: 'a', 2: 'b', 3: 'c'}>>>
方法2:
>>> dict(((1,'a'),(2,'b'),(3,'c'))){1: 'a', 2: 'b', 3: 'c'}
其原理:
还可以通过列表,和元组一样
方法3:
>>> dict([(1,'a'),(2,'b'),(3,'c')]){1: 'a', 2: 'b', 3: 'c'}
方法4:打包zip
>>> dict(zip([1,2,3],['a','b','c'])){1: 'a', 2: 'b', 3: 'c'}
zip相当于干了方法2前面的事情
添加:d[4]='x'>>> d{2: 'b', 3: 'c', 4: 'x'}替换>>> d = dict(zip([1,2,3],['a','b','c']))>>> d{1: 'a', 2: 'b', 3: 'c'}>>> d[1] = 'd'>>> d{1: 'd', 2: 'b', 3: 'c'}
>>> d.pop(1)'d'>>> d{2: 'b', 3: 'c'}
访问字典:
>>> d.items()dict_items([(2, 'b'), (3, 'c'), (4, 'x')])>>> list(d.keys())[2, 3, 4]>>> list(d.values())['b', 'c', 'x']
python的集合骚操作:
大括号**{}——代表集合set,在java中{}是数组 中括号 小括号
这个有点java的哈希集,HashSet是不能重复的,只有key
print(a)(3, 2, 1)>>> print(type(a))<class 'tuple'>>>> set(a){1, 2, 3}>>> {2,1,3,3,4}{1, 2, 3, 4}>>> {}{}>>> type({})<class 'dict'>
>>> a = {1,2,3,4}>>> a.add(6)>>> a{1, 2, 3, 4, 6}>>> 1 in aTrue>>> a.remove(7)Traceback (most recent call last):File "<stdin>", line 1, in <module>KeyError: 7>>> a.remove(2)>>> a{1, 3, 4, 6}>>> a.clear()>>> aset()>>>
python 元组骚操作
>>> a = (100,'张三')>>> print(a)(100, '张三')>>> id, name = a>>> print(id)100>>> print(name)张三
python 深拷贝与浅拷贝
**浅拷贝(copy):**拷贝父对象,不会拷贝对象的内部的子对象。共用内部的子对象。
深拷贝(deepcopy):copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
python多线程能用多个cpu么?
答:不能哦!!!
python的多线程不能利用多核CPU
原因是python的解释器使用了GIL(Global Interpreter Lock),在任意时刻中只允许单个python线程运行。无论系统有多少个CPU核心,python程序都只能在一个CPU上运行。
GIL 中文译为全局解释器锁,其本质上类似操作系统的 Mutex。
GIL 的功能是:在 CPython 解释器中执行的每一个 Python 线程,都会先锁住自己,以阻止别的线程执行。
python垃圾回收机制
Python的垃圾回收机制是以:引用计数器为主【自动】,标记清除和分代回收为辅【手动】。
(1)主要的回收垃圾方式1:引用计数:每个对象内部都维护了一个值,该值记录这此对象被引用的次数,如果次数为0,则Python垃圾回收机制会自动清除此对象。
(2)辅助方式2:标记-清除(Mark—Sweep):被分配对象的计数值与被释放对象的计数值之间的差异累计超过某个阈值,则Python的收集机制就启动
(3)辅助方式3:当代码中主动执行gc.collect()命令时,Python解释器就会进行垃圾回收。
python里的生成器是什么
生成器是一种可以简单有效的创建迭代器的工具。
它们像常规函数一样撰写,但是在需要返回数据时使用yield语句。
每当对它调用next()函数, 生成器从它上次停止的地方
(它会记住所有的数据值和上次执行的语句)。
迭代器和生成器的区别
迭代器有两个方法next方法和iter方法,
iter方法获取对象的迭代器,
next方法返回下一个迭代器。
生成器:使用了 yield 的函数被称为生成器(generator),在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值,
并在下一次执行next()方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
区别
**语法上:**生成器是通过函数的形式中调用 yield 或()的形式创建的;
迭代器可以通过 iter()内置函数创建
**用法上:**生成器在调用next()函数或for循环中,所有过程被执行,且返回值;
迭代器在调用next()函数或for循环中,所有值被返回,没有其他过程或说动作。
装饰器
装饰器可以实现,在不改变函数或类的内部代码与调用方式的情况下,使其拥有额外的功能。
应用场景:插入日志、性能测试、事务处理、缓存、权限校验
python有哪些数据类型
数字num,字符串string,
列表list,元组tuple,字典dict,集合set
所有语言都类似,java也是
python中,容器类数据类型:
序列可以通过下标索引:
Python 中列表( List )的各种操作,比如 del,remove,和 pop 等的用法和区别
[]中括号——代表列表,这是python的固有类型方式
()括号——代表元组
索引下标,去赋值就行了。
(1)pop
value = List.pop(index)
1、pop按照索引位置删除元素;2、无参数时默认删除最后一个元素;3、返回删除的元素值
(2)remove
1、remove 按照值删除,删除单个元素;2、删除首个符合条件的元素;3、返回值为空 None
(3)del
根据索引位置来删除单个值或指定范围内的值。
del是删除**引用(变量)**而不是删除对象(数据),对象由自动垃圾回收机制(GC)删除
python yeild 和return的区别
(1)共同点:return和yield都用来返回值;
在一次性地返回所有值场景中return和yield的作用是一样的。
(2)**不同点:**如果要返回的数据是通过for等循环生成的迭代器类型数据(如列表、元组),return只能在循环外部一次性地返回,yeild则可以在循环内部逐个元素返回。
牛啊!!!
python set底层实现
散的列表。
与dict不一样,dict是字典,键值对,有key和value
set没有value,只有key【java中是这样的】
python字典和set()的区别
(1)字典是一系列无序的键值对的组合;集合里的元素不是键值对,是单一的一个元素key。
(2)从python3.6后,字典有序;集合无序
java找中的hashSet是有序的,不重复的。
(3)字典键不能重复;集合元素不能重复——都不能重复
怎么对字典的值进行排序?
方法一:转化为元组,(91,“张三”)的形式 ,用sorted()函数进行排序
方法二 :设置sorted() 中key的参数的值
#-*-coding:UTF-8-*-#先生成一个随机字典from random import randintd= {x:randint(60,101) for x in "abcdxyz"}print(d)#方法一:元组形式#把值放前面是因为sorted()排序默认按从头比较z = zip(d.values(),d.keys())#x = zip(d.itervalues(),d.iterkeys()) 迭代类型,省空间#排序s = sorted(z)print(s)#方法二:sorted(key的设置)a = d.items()s = sorted(a,key= lambda x:x[1])print(s)
init和new和call的区别
__init__和
__new__和
__call__的区别
(1)__init__是初始化方法,
(2)new实例化对象
(3)call:允许一个类的实例像函数一样被调用。
实质上说,这意味着 x() 与 x.call() 是相同的
import常用库
time, random, sys, os, math
numpy, pandas, torch, torchvision等
python的lamda函数
它是一个单独的表达式匿名函数,通常用作内联函数
为什么要使用Python Lambda函数?——它是一次性口罩,用完就扔。
匿名函数可以在程序中任何需要的地方使用,但是这个函数只能使用一次,即一次性的。
因此Python Lambda函数也称为丢弃函数,它可以与其他预定义函数(如filter(),map()等)一起使用。
相对于我们定义的可重复使用的函数来说,这个函数更加简单便捷。
Python内存管理
Python的内存管理机制可以从三个方面来讲
(1)垃圾回收
(2)引用计数
(3)内存池机制
python在内存上做了哪些优化?
Python的内存管理机制可以从三个方面来讲
(1)垃圾回收
(2)引用计数
(3)内存池机制
Python中类方法和静态方法的区别
Python类方法和实例方法相似,它最少也要包含一个参数,只不过类方法中通常将其命名为cls,Python 会自动将类本身绑定给 cls 参数(注意,绑定的不是类对象)。也就是说,我们在调用类方法时,无需显式为 cls 参数传参。
静态方法没有类似 self、cls 这样的特殊参数,因此 Python 解释器不会对它包含的参数做任何类或对象的绑定。也正因为如此,类的静态方法中无法调用任何类属性和类方法。
跟c++很像,当然,python就是从c++封装过来的,只不过简单很多。
python多线程怎么实现
Python 提供多线程编程的模块有以下几个:
_thread
threading
Queue
multiprocessing
点积和矩阵相乘的区别?
点积=内积:维度完全一致的两个向量相乘,得到一个标量
矩阵相乘:XN NY==>X*Y,得到的依然是一个矩阵
Python中错误和异常处理
python中会发生两种类型的错误。
**语法错误:**如果未遵循正确的语言语法,则会引发语法错误。
比如少写了一个冒号:或少了tab。
这种错误编译器会为我们指出来,不用我们担心。
逻辑错误(异常):在运行时中,通过语法测试后发生错误的情况称为异常或逻辑类型。 比如
处理方式为:通过try…except…finally代码块来处理捕获异常并手动处理。
Python 的传参是传值还是传址?
说传值或者传引用都不准确。
非要安一个确切的叫法的话,叫传对象(call by object)
什么是猴子补丁?
谓的猴子补丁的含义是指在动态语言中,不去改变源码而对功能进行追加和变更
可扩展性强
当退出 Python 时是否释放所有内存分配?
答案是否定的。
那些具有对象循环引用或者全局命名空间引用的变量,在 Python 退出是往往不会被释放。另外不会释放C 库保留的部分内容。
Python 中的 is 和 == 有什么区别?
is比较地址:比较的是两个对象的id值是否相等,
也就是比较两个对象是否为同一个实例对象,是否指向同一个内存地址。
==比较值:比较的是两个对象的内容是否相等,默认会调用对象的eq()方法。
gbk和utf8的区别
GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准。
GBK编码专门用来解决中文编码的,是双字节的。
不论中英文都是双字节的。
UTF-8 编码是用以解决国际上字符的一种多字节编码,
它对英文使用8位(即一个字节),
中文使用24位(三个字节)来编码。
对于英文字符较多的论坛则用UTF-8 节省空间。
另外,如果是外国人访问你的GBK网页,需要下载中文语言包支持。
访问UTF-8编码的网页则不出现这问题。可以直接访问。
GBK包含全部中文字符;
UTF-8则包含全世界所有国家需要用到的字符。
遍历字典可以用什么方法
4种:
for循环
键值对的健
键值对的值
键值对元素
dic1 = {'date':'.11.2','name':'carlber','work':"遍历",'number':3}for i in dic1: print(i)for key in dic1.keys(): #遍历字典中的**键**print(key)for value in dic1.values(): #遍历字典中的**值**print(value)for item in dic1.items(): #**遍历字典中的元素**print(item)
反转列表的方法
Reverse()
sorted()指定reverse
python 元组中元组转为字典
#create a tupletuplex = ((2, "w"),(3, "r"))print(dict((y, x) for x, y in tuplex))
range在python2和python3里的区别
在py2中,range得到的是一个列表,
在py3中,range得到的是一个生成器,节约内存
init.py 文件的作用以及意义
这个文件定义了包的属性和方法,它可以什么也不定义;
可以只是一个空文件,但是必须存在。
如果init.py 不存在,这个目录就仅仅是一个目录,而不是一个包,它就不能被导入或者包含其它的模块和嵌套包。
或者可以这样理解。
这样,当我们导入这个包的时候,init.py文件自动运行。
帮我们导入了这么多个模块
我们就不需要将所有的 **import语句写在一个文件里了,也可以减少代码量 **
python的字符串的加法和乘法操作
乘法就是加法:
切片操作
左闭右开!!!和java一样
step是跳过的点
省略start或者end,用:替代,就是从0开始,或者到最后
python中的成员测试:判断x在其中吗?
python没有字符类型,只有字符串类型——这与java不同哦
总结
提示:重要经验:
1)python的基础知识,虽然平时都在编代码,但是我们用的都是现成的深度学习模块啥的,里面的其他python知识不是非常了解
2)没事就来看看,互联网大厂的笔试题和面试题都会考,尤其像京东的笔试选择题,一定会考的。