设为首页 收藏本站
查看: 1234|回复: 0

[经验分享] Python(八)高级特性

[复制链接]

尚未签到

发表于 2018-8-5 11:26:44 | 显示全部楼层 |阅读模式
  使用技巧
#!/usr/bin/env python  
# coding:utf-8
  
def fun():
  
    return "hello"
  
    print "world"
  
#在函数里面,遇到return,这个函数执行结束,return之后的语句不再执行,所以这里直接调用函数不会输出结果
  
fun()
  
#如果在调用的时候使用print+函数名,表示输出函数的返回值,因此这里会输出返回值“hello”
  
print fun()
  迭代(iteration)
  判断一个对象可迭代:
  1.可以通过for循环来遍历
DSC0000.jpg

  2.通过collections模块的iterable类型判断
DSC0001.jpg

  如果要对 list 实现类似 Java 那样的下标循环怎么办:
  python内置的枚举方法enumerate,把一个 list 变成索引­元素对
DSC0002.jpg

  列表生成式
  for循环输出结果(输出1-10之间所有整数求平方之后的结果):
  In [41]: [i**2 for i in range(1,11)]
  Out[41]: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
  for循环+if语句(输出1-10之间所有整数求平方,再跟2取余为0的结果):
  In [42]: [i**2 for i in range(1,11) if (i**2)%2==0]
  Out[42]: [4, 16, 36, 64, 100]
  for循环+for循环(输出'abc'和'123'的全排列):
  In [46]: [i+j for i in "abc" for j in "123"]
  Out[46]: ['a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3']
  扩展:
  列出当前目录下的所有.py文件或目录:
  In [8]: [i for i in os.listdir(".") if i.endswith(".py")]
  Out[8]: ['xuehao.py', 'var_name_rule.py']
  #os.listdir(".")表示列出当前目录下所有文件、目录
  #i.endswith(".py")表示以.py结尾的
  题目1:
  给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输
  入值小于1000。
  如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
  解答:
#!/usr/bin/env python  
# coding:utf-8
  
shuru=input(&quot;输入一个正整数(<=1000):&quot;)
  
def zhishu(num):
  
    for i in range(2,num):
  
        if num%i == 0:
  
            return False
  
    else:
  
        return True
  

  
p=[i for i in range(2,shuru) if zhishu(i)]
  

  
peidui=[(m,n) for m in p for n in p if m+n == shuru and m <= n]
  
print len(peidui)
  生成器
  一、简介
  1.背景
  通过列表生成式,我们可以直接创建一个列表:
DSC0003.jpg

  受到内存限制,列表容量肯定是有限的,例如创建一个包含 100 万个元素的列表,会占用很大的存储空间,创建过程有可能使电脑卡住。
  2.定义
  在循环的过程中不断由前一个元素推算出后一个元素,但是后续元素并不立刻生成出来。这样就不必创建完整的 list,从而节省大量的空间。在 Python 中,这种一边循环一边计算的机制,称为生成器(Generator)
  3.使用生成器的方法
  (1.)把一个列表生成式的 [] 改成 ()
  >>> g = (i for i in range(1,10000000))
  >>> g
  <generator object <genexpr> at 0x7f13a59d97d0>
  调用:
  - 使用.next()每调用一次显示一个元素
DSC0004.jpg

  - 使用for循环
DSC0005.jpg

  (2.)yield
  如果函数里面有yield关键字,那么调用这个函数的结果赋值给的变量为生成器
  当生成器g调用第一个next方法时,会运行函数,直到遇到第一个yield停止
  当调用第二个next方法时,会从停止的地方继续执行,直到遇到下一个yield
#!/usr/bin/env python  
# coding:utf-8
  
def fun():
  
    print &quot;1.&quot;          #输出&quot;1.&quot;
  
    yield &quot;第一个yield&quot;  #遇到yield停止,yield后面跟的内容可以在print g.next()时显示出来
  
    print &quot;2.&quot;
  
    yield &quot;第二个yield&quot;
  
    print &quot;3.&quot;
  
    yield &quot;第三个yield&quot;
  
    print &quot;4.&quot;
  
    yield &quot;第四个yield&quot;
  

  
g = fun()
  

  
print g.next()
  
print g.next()
  
print g.next()
  
print g.next()
  执行结果:
  [root@python code5]# python test.py
  1.
  第一个yield
  2.
  第二个yield
  3.
  第三个yield
  4.
  第四个yield
  题目1:
  Fibonacci(斐波纳契)数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到:1, 1, 2, 3, 5, 8, 13, 21,...,本题要求生成6个数即可
  解答:
#!/usr/bin/env python  
# coding:utf-8
  
def fib(max):    #max为最终生成fib数列个数
  
    n,a,b = 0,0,1   #n代表当前fib数列个数,a代表n-1的值,b代表n的值
  
    while n < max:
  
        yield b     #当前第一个数列
  
        a,b = b,a+b
  
        n += 1
  

  
g = fib(6)   #变量g就是生成器
  

  
print g.next()
  
print g.next()
  
print g.next()
  
print g.next()
  
print g.next()
  
print g.next()
  (3.)send用法
  使用send方法给生成器函数发送数据
  使用send方法前,必须先调用一次next()方法
  遇到下一个yield停止
#!/usr/bin/env python  
# coding:utf-8
  
def fun():
  
    print &quot;bbbb&quot;
  
    num1 = yield
  
    print num1
  
    num2 = yield
  
    print num2
  

  
g = fun()   #g是生成器
  

  
g.next()    #使用send方法前,必须先调用一次next()方法
  
g.send(1)   #将1发送给变量num1,此时num1=1
  
g.send(11)  #将11发送给变量num1,此时num1=11
  执行结果:
DSC0006.jpg

  题目2:
  生产者-消费者(producer-consumer)模型,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的
缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一个是消费者,用于从缓冲区中取出消息。问题出现在当缓冲区已经满了,而此时生产者还想向其中放入
一个新的数据项的情形,其解决方法是让生产者此时进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它。同样地,当缓冲区已经空了,而消费
者还想去取消息,此时也可以让消费者进行休眠,等待生产者放入一个或者多个数据时再唤醒它。
  解答:
#!/usr/bin/env python  
# coding:utf-8
  
import time  #调用time内置模块
  
food = []    #定义一个food列表,模拟包子店的所有包子
  
def consumer(name):
  
    print &quot;%s准备买包子&quot; %(name)
  
    while True:
  
        baozi_name = yield
  
        print &quot;客户[%s]买了[%s]馅的包子&quot; %(name,baozi_name)
  
        food.remove(baozi_name)  #当客户买了这个馅的包子就从列表中删除
  

  
def producer(name,*kind):  #*kind表示使用函数中的可变参数
  
    c1 = consumer(&quot;客户1&quot;)
  
    c1.next()
  
    print &quot;准备制作包子...&quot;
  
    for i in kind:
  
        time.sleep(1)  #表示休眠一秒,模拟厨师制作包子过程
  
        print &quot;厨师[%s]做了[%s]馅包子&quot; %(name,i)
  
        food.append(i)  #厨师制作了这个馅的包子就在列表中加入
  
        c1.send(i)
  

  
producer(&quot;白胡子&quot;,&quot;牛肉&quot;,&quot;韭菜&quot;,&quot;豆沙&quot;)
  题目3:
  简易聊天机器人
  解答:

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-546953-1-1.html 上篇帖子: python---文件操作 下篇帖子: python 编码问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表