当前位置: 首页 > news >正文

网站不兼容ie6免费建立自己的网页

网站不兼容ie6,免费建立自己的网页,免费网站外链推广,做网站被抓前言#xff1a; Hello大家好#xff0c;我是Dream。 今天来总结一下Python和C语言中常见的面试知识#xff0c;欢迎大家一起前来探讨学习~ 【一】Python中迭代器的概念#xff1f; 可迭代对象是迭代器、生成器和装饰器的基础。简单来说#xff0c;可以使用for来循环遍历… 前言 Hello大家好我是Dream。 今天来总结一下Python和C语言中常见的面试知识欢迎大家一起前来探讨学习~ 【一】Python中迭代器的概念 可迭代对象是迭代器、生成器和装饰器的基础。简单来说可以使用for来循环遍历的对象就是可迭代对象。比如常见的list、set和dict。 我们来看一个例子 from collections import Iterable print(isinstance(abcddddd, Iterable)) # str是否可迭代print(isinstance([1,2,3,4,5,6], Iterable)) # list是否可迭代print(isinstance(12345678, Iterable)) # 整数是否可迭代-------------结果如下---------------- True True False当对所有的可迭代对象调用 dir() 方法时会发现他们都实现了 iter 方法。这样就可以通过 iter(object) 来返回一个迭代器。 x [1, 2, 3] y iter(x) print(type(x))print(type(y))------------结果如下------------ class list class list_iterator可以看到调用iter()之后变成了一个list_iterator的对象。可以发现增加了一个__next__方法。所有实现了__iter__和__next__两个方法的对象都是迭代器。 迭代器是带状态的对象它会记录当前迭代所在的位置以方便下次迭代的时候获取正确的元素。__iter__返回迭代器自身__next__返回容器中的下一个值如果容器中没有更多元素了则抛出Stoplteration异常。 x [1, 2, 3] y iter(x) print(next(y)) print(next(y)) print(next(y)) print(next(y))----------结果如下---------- 1 2 3 Traceback (most recent call last):File /Users/Desktop/test.py, line 6, in moduleprint(next(y)) StopIteration如何判断对象是否是迭代器和判断是否是可迭代对象的方法差不多只要把 Iterable 换成 Iterator。 Python的for循环本质上就是通过不断调用next()函数实现的举个栗子下面的代码先将可迭代对象转化为Iterator再去迭代。这样可以节省对内存因为迭代器只有在我们调用 next() 才会实际计算下一个值。 x [1, 2, 3] for elem in x:...itertools 库提供了很多常见迭代器的使用。 from itertools import count # 计数器counter count(start13)next(counter) 13next(counter) 14【二】Python中生成器的相关知识 我们创建列表的时候受到内存限制容量肯定是有限的而且不可能全部给他一次枚举出来。Python常用的列表生成式有一个致命的缺点就是定义即生成非常的浪费空间和效率。 如果列表元素可以按照某种算法推算出来那我们可以在循环的过程中不断推算出后续的元素这样就不必创建完整的list从而节省大量的空间。在Python中这种一边循环一边计算的机制称为生成器generator。 要创建一个generator最简单的方法是改造列表生成式 a [x * x for x in range(10)] print(a) b (x * x for x in range(10)) print(b)--------结果如下-------------- [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] generator object genexpr at 0x10557da50还有一个方法是生成器函数通过def定义然后使用yield来支持迭代器协议比迭代器写起来更简单。 def spam():yieldfirstyieldsecondyieldthirdfor x in spam():print(x)-------结果如下--------- first second third进行函数调用的时候返回一个生成器对象。在使用next()调用的时候遇到yield就返回记录此时的函数调用位置下次调用next()时从断点处开始。 我们完全可以像使用迭代器一样使用 generator 当然除了定义。定义一个迭代器需要分别实现 iter() 方法和 next() 方法但 generator 只需要一个小小的yield。 generator还有 send() 和 close() 方法都是只能在next()调用之后生成器处于挂起状态时才能使用的。 python是支持协程的也就是微线程就是通过generator来实现的。配合generator我们可以自定义函数的调用层次关系从而自己来调度线程。 【三】Python中装饰器的相关知识 装饰器允许通过将现有函数传递给装饰器从而向现有函数添加一些额外的功能该装饰器将执行现有函数的功能和添加的额外功能。 装饰器本质上还是一个函数它可以让已有的函数不做任何改动的情况下增加功能。 接下来我们使用一些例子来具体说明装饰器的作用 如果我们不使用装饰器我们通常会这样来实现在函数执行前插入日志 def foo():print(i am foo)def foo():print(foo is running)print(i am foo)虽然这样写是满足了需求但是改动了原有的代码如果有其他的函数也需要插入日志的话就需要改写所有的函数这样不能复用代码。 我们可以进行如下改写 import loggingdef use_log(func):logging.warning(%s is running % func.__name__)func()def bar():print(i am bar)use_log(bar) #将函数作为参数传入-------------运行结果如下-------------- WARNING:root:bar is running i am bar这样写的确可以复用插入的日志缺点就是显式的封装原来的函数我们希望能隐式的做这件事。 我们可以用装饰器来写 import loggingdef use_log(func):def wrapper(*args, **kwargs):logging.warning(%s is running % func.__name__)return func(*args, **kwargs)return wrapperdef bar():print(I am bar)bar use_log(bar) bar()------------结果如下------------ WARNING:root:bar is running I am bar其中use_log函数就是装饰器它把我们真正想要执行的函数bar()封装在里面返回一个封装了加入代码的新函数看起来就像是bar()被装饰了一样。 但是这样写还是不够隐式我们可以通过语法糖来起到bar use_log(bar)的作用。 import loggingdef use_log(func):def wrapper(*args, **kwargs):logging.warning(%s is running % func.__name__)return func(*args, **kwargs)return wrapperuse_log def bar():print(I am bar)use_log def haha():print(I am haha)bar() haha()------------结果如下------------ WARNING:root:bar is running I am bar WARNING:root:haha is running I am haha这样子看起来就非常简洁而且代码很容易复用。可以看成是一种智能的高级封装。 【四】Python的深拷贝与浅拷贝 在Python中用一个变量给另一个变量赋值其实就是给当前内存中的对象增加一个“标签”而已。 a [6, 6, 6, 6]b aprint(id(a), id(b), sep \n) 66668888 66668888 a is b True可以看出其实a和b指向内存中同一个对象。浅拷贝是指创建一个新的对象其内容是原对象中元素的引用新对象与原对象共享内存中的子对象。 注浅拷贝和深拷贝的不同仅仅是对组合对象来说所谓的组合对象就是包含了其他对象的对象如列表类实例等等。而对于数字、字符串以及其他“原子”类型没有拷贝一说产生的都是原对象的引用。 常见的浅拷贝有切片操作、工厂函数、对象的copy()方法copy模块中的copy函数。 a [6, 8, 9]b list(a)print(id(a), id(b)) 4493469248 4493592128 #a和b的地址不同 for x, y in zip(a, b): ... print(id(x), id(y)) ... 4489786672 4489786672 4489786736 4489786736 4489786768 4489786768 # 但是他们的子对象地址相同从上面的例子中可以看出a浅拷贝得到ba和b指向内存中不同的list对象但是他们的元素指向相同的int对象这就是浅拷贝。 深拷贝是指创建一个新的对象然后递归的拷贝原对象所包含的子对象。深拷贝出来的对象与原对象没有任何关联。 深拷贝只有一种方式copy模块中的deepcopy函数。 我们接下来用一个包含可变对象的列表来确切地展示浅拷贝和深拷贝的区别 a [[6, 6], [8, 8], [9, 9]]b copy.copy(a) # 浅拷贝c copy.deepcopy(a) # 深拷贝print(id(a), id(b)) # a和b地址不同 4493780304 4494523680for x, y in zip(a, b): # a和b的子对象地址相同 ... print(id(x), id(y)) ... 4493592128 4493592128 4494528592 4494528592 4493779024 4493779024print(id(a), id(c)) # a和c不同 4493780304 4493469248for x, y in zip(a, c): # a和c的子对象地址也不同 ... print(id(x), id(y)) ... 4493592128 4493687696 4494528592 4493686336 4493779024 4493684896【五】Python是解释语言还是编译语言 Python是解释语言。 解释语言的优点是可移植性好缺点是运行需要解释环境运行起来比编译语言要慢占用的资源也要多一些代码效率低。 编译语言的优点是运行速度快代码效率高编译后程序不可以修改保密性好。缺点是代码需要经过编译才能运行可移植性较差只能在兼容的操作系统上运行。 【六】Python的垃圾回收机制 在Python中使用引用计数进行垃圾回收同时通过标记-清除算法解决容器对象可能产生的循环引用问题最后通过分代回收算法提高垃圾回收效率。 【七】Python里有多线程吗 Python里的多线程是假的多线程。 Python解释器由于设计时有GIL全局锁导致了多线程无法利用多核只有一个线程在解释器中运行。 对于I/O密集型任务Python的多线程能起到作用但对于CPU密集型任务Python的多线程几乎占不到任何优势还有可能因为争夺资源而变慢。 对所有面向I/O的会调用内建的操作系统C代码的程序来说GIL会在这个I/O调用之前被释放以允许其它的线程在这个线程等待I/O的时候运行。 如果是纯计算的程序没有 I/O 操作解释器会每隔 100 次操作就释放这把锁让别的线程有机会执行这个次数可以通过 sys.setcheckinterval 来调整如果某线程并未使用很多I/O 操作它会在自己的时间片内一直占用处理器和GIL。 缓解GIL锁的方法多进程和协程协程也只是单CPU但是能减小切换代价提升性能 【八】Python中range和xrange的区别 首先xrange函数和range函数的用法完全相同不同的地方是xrange函数生成的不是一个list对象而是一个生成器。 要生成很大的数字序列时使用xrange会比range的性能优很多因为其不需要一上来就开辟很大的内存空间。 Python 2.7.15 | packaged by conda-forge | (default, Jul 2 2019, 00:42:22) [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin Type help, copyright, credits or license for more information.range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]xrange(10) xrange(10)list(xrange(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]xrange函数和range函数一般都用在循环的时候。具体例子如下所示 for i in range(0,7): ... print(i) ... 0 1 2 3 4 5 6 for i in xrange(0,7): ... print(i) ... 0 1 2 3 4 5 6在Python3中xrange函数被移除了只保留了range函数的实现但是此时range函数的功能结合了xrange和range。并且range函数的类型也发生了变化在Python2中是list类型但是在Python3中是range序列的对象。 【九】Python中列表和元组的区别 列表是可变的在创建之后可以对其进行任意的修改。 元组是不可变的元组一旦创建便不能对其进行更改可以元组当作一个只读版本的列表。 元组无法复制。 Python将低开销的较大的块分配给元组因为它们是不可变的。对于列表则分配小内存块。与列表相比元组的内存更小。当你拥有大量元素时元组比列表快。 【十】Python中dict字典的底层结构 Python的dict字典为了支持快速查找使用了哈希表作为底层结构哈希表平均查找时间复杂度为O(1)。CPython 解释器使用二次探查解决哈希冲突问题。 【十一】常用的深度学习框架有哪些都是哪家公司开发的 PyTorchFacebook TensorFlowGoogle KerasGoogle MxNetDmlc社区 CaffeUC Berkeley PaddlePaddle百度 【十二】PyTorch动态图和TensorFlow静态图的区别 PyTorch动态图计算图的运算与搭建同时进行其较灵活易调节。 TensorFlow静态图计算图先搭建图后运算其较高效不灵活。 文末推荐 内容介绍 《机器学习平台架构实战》详细阐述了与机器学习平台架构相关的基本解决方案主要包括机器学习和机器学习解决方案架构机器学习的业务用例机器学习算法机器学习的数据管理开源机器学习库Kubernetes容器编排基础设施管理开源机器学习平台使用AWS机器学习服务构建数据科学环境使用AWS机器学习服务构建企业机器学习架构高级机器学习工程机器学习治理、偏差、可解释性和隐私使用人工智能服务和机器学习平台构建机器学习解决方案等内容。此外本书还提供了相应的示例、代码以帮助读者进一步理解相关方案的实现过程。 当当 https://product.dangdang.com/29625469.html 京东 https://item.jd.com/13855627.html
http://www.zqtcl.cn/news/371736/

相关文章:

  • 汽车行业网站设计做互联网公司网站谈单模拟视频教学
  • 做网站界面设计注意什么江苏宿迁房产网
  • 传奇服务器网站如何建设帮人做兼职的网站
  • 织梦手机网站有广告位wordpress媒体库现实不全
  • 网站建设外包公司怎么样珠海网站排名提升
  • 电子商务网站建设结业论文做网站的图片字虚
  • 米拓建站最新进展注册做网站的公司有哪些
  • 设计网站设计wordpress 改系统
  • 学校网站建设评审会议通知网站是怎么赢利的
  • 手机网站建设 苏州优化网站哪个好
  • 网站建设流程方案通州网站建设公司
  • 免费的十大免费货源网站全国领先网站制作
  • 农业网站建设方案 ppt中国有什么网站做跨境零售
  • 网站文章结构变更怎么做301如何自己制作自己的网站
  • 网站网站平台建设方案免费制作桥架app
  • 杭州网站界面设计招网站建设销售
  • 网站开发 流程图广州优化seo
  • 夫妻工作室网站建设品牌建设的内容
  • php搭建网站后台建设银行网站如何修改账单地址
  • 网站域名查询系统关键词语有哪些
  • 专业金融网站建设wordpress匿名投稿
  • 生产做网站表带的制造厂家百度文库个人登录
  • 丰都网站建设费用成都品牌包装设计
  • 建设项目安监备案网站免费学生网页制作成品代码
  • wordpress默认登陆地址修改廊坊百度关键词优化怎么做
  • 免费下载策划书的网站外贸网站 域名后缀
  • 网站导航条做信息网站需要什么
  • 网站推广朋友圈文案嵩县网站建设
  • 网站建设实践考试试题app运营推广策划方案
  • django网站开发源码阿里邮箱登录