zoukankan      html  css  js  c++  java
  • python学习笔记(五)——语句

                   语句(条件、循环和其他语句)

      之前一直在学习数据结构,单纯的结构并不能做什么事,只有组成语句之后才能实现比较复杂的功能,和其他语言一样,条件、循环是必不可少的。学习基本语句之前,先看一些其它知识。

    关于print:

    >>> print 1,2,3  #print的参数不能构成一个元组
    1 2 3
    >>> 1,2,3
    (1, 2, 3)
    >>> print (1,2,3)
    (1, 2, 3)
    >>> print 'Age',22  #输出的每个参数之间插入了一个空格
    Age 22
    >>> name='jason'
    >>> greeting='hello,'
    >>> print greeting,name  #同时输出文本和变量值
    hello, jason

    如果在结尾处加上逗号,那么接下来的语句会和前一条语句在同一行打印,如:

    print 'hello,',
    print 'world!'    #输出的结果为hello,world,注意这里要在脚本中运行

    关于模块导入:

    已经知道,导入模块的时候可以有以下几个方式:

    import module

    from module import function

    from module import function1,function2,.....

    from module import *

    可以使用as为整个模块或者函数提供别名:

    >>> import math as m
    >>> m.sqrt(4)
    2.0
    >>> from math import sqrt as S
    >>> S(4)
    2.0

    关于赋值:

    (1)、序列解包——将多个值的序列解开,然后放到变量的序列中

    >>> x,y,z=1,2,3  #多个赋值操作可以同时进行
    >>> print x,y,z
    1 2 3
    >>> x,y=y,x  #两个或多个变量交换
    >>> print x,y,z
    2 1 3
    >>> values=1,2,3  #序列解包
    >>> values
    (1, 2, 3)
    >>> a,b,c=values
    >>> a
    1
    #当函数或者方法返回元组时,这个很有用,它允许返回一个以上的值并打包成元组 >>> seq={'name':'jason','phone':'34223'} >>> key,value=seq.popitem() #获取popitem方法删除时返回的键值对 >>> key 'phone' >>> value '34223'

    注意:解包的序列中的元素数量必须和放置在赋值号=左边的变量数量完全一致

    (2)、链式赋值

    >>> x=y=z=2  #则xyz的值均为2
    >>> y=3
    >>> x=y
    >>> x
    3

    (3)、增量赋值

    >>> x=2
    >>> x+=1
    >>> x*=2
    >>> x
    6
    >>> str='python'
    >>> str*=2
    >>> str
    'pythonpython'

      在学习语句之前,我想说python中的缩进是个很坑爹的东西,它不仅仅是可读性那么简单了,少了或多了一个空格都是语法错误,而且很难排查,而且tab键也不太建议用,每个缩进是4个空格。因为python中的语句块不是通过大括号来区分的,所以就由缩进担当了这个大括号的角色,对它要求严格也很正常。

    条件和条件语句:

    (1)、布尔变量

      python中把空值和0也看作是false,总结下来,python中的假有如下几个:

    False,None,0,"",(),[],{}  即空字符串、空元组、空列表、空字典都为假。其它的一切都被解释器解释为真

    >>> True
    True
    >>> False
    False
    >>> bool(0)
    False
    >>> bool("")
    False
    >>> bool(42)
    True
    >>> 0==0
    True

    (2)、if、elif、else语句(注意缩进且最好作为脚本运行而不是在交互式环境下)

    num=input('enter a number:')
    if num>0:
    	print 'positive number'
    elif num<0:
    	print 'negative number'
    else :
    	print 'zero'
    raw_input('press any key to exit!')
    

    (3)、嵌套代码块

    name=input('please input your name:')
    if name.endswith('jzhou'):
        if name.startswith('Mr.'):
            print 'hello,Mr.jzhou'
        elif name.startswith('Mrs.'):
            print 'hello,Mrs.jzhou'
        else:
            print 'hello,jzhou'
    else:
        print 'hello,stranger!'    
    raw_input('press any key to exit!')
    

    (4)、更复杂的条件

      1)、比较运算符(==,<,<=,>,>=,!=)

    >>> 'foo'=='foo'
    True
    >>> 'foo'=='oof'
    False
    >>> 'foo'!='oof'
    True

      2)、is:同一性运算符(判断是否属于同一个对象,而不是值是否相等)

    >>> x=y=[1,2,3]
    >>> z=[1,2,3]
    >>> x==y
    True
    >>> x==z
    True
    >>> x is y
    True
    >>> x is z
    False

      再看一个例子,有意让x和y的值相等,看看它们是否属于同一对象

    >>> x=[1,2,3]
    >>> y=[2,4]
    >>> x is not y
    True
    >>> del x[2]  #删除x中的元素3,即为[1,2]
    >>> y[1]=1   #将y的第二个元素改为1,即为[2,1]
    >>> y.reverse ()  #将y的元素倒序,即为[1,2]
    >>> x==y
    True
    >>> x is y
    False

      3)、in:成员资格运算符

    >>> name
    'jason'
    >>> if 's' in name:
        print 'your name contains the letter "s"'
    else :
        print 'your name doesn\'t contains the letter "s"'
        
    your name contains the letter "s"

      4)、字符串和序列的比较

    >>> "alpha"<"beta"
    True
    >>> 'Jzhou'.lower()=='JZHOU'.lower()
    True
    >>> [1,2]<[2,1]
    True
    >>> [2,[1,5]]>[2,[1,4]]
    True

      5)、逻辑运算符(and,or)

    >>> number=input('enter a number between 1 and 10:')
    enter a number between 1 and 10:4
    >>> if number <=10 and number >=1:
        print 'Great!'
    else:
        print 'wrong!'
    
        
    Great!

    断言——当输入不符合条件时,可以用断言来解释,即在程序中置入检查点

    >>> age=-1
    >>> assert 0<age<100,'The age must be realistic' #如果age输入在[0,100]之外,则提示出错
    
    Traceback (most recent call last):
      File "<pyshell#79>", line 1, in <module>
        assert 0<age<100,'The age must be realistic'
    AssertionError: The age must be realistic

    循环

    (1)、while

    >>> x=1
    >>> while x<=100:
        print x
        x+=1

    (2)、for

    >>> words=['this','is','an','egg']
    >>> for word in words:
        print word
       
    this
    is
    an
    egg
    >>> numbers=[1,2,3,4,5,6,7,8,9]
    >>> for num in numbers:
        print num

    有个内建的迭代函数range,它类似于分片,包含下界,不包含上界

    >>> range(1,10)
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> for num in range(1,5):
        print num

    (3)、循环遍历字典元素

    >>> d={'x':1,'y':2,'z':3}
    >>> for key in d:
        print key,'corresponds to',d[key]
        
    y corresponds to 2
    x corresponds to 1
    z corresponds to 3
    >>> for key,value in d.items ():  #这种用法很重要
        print key,'corresponds to',value
        
    y corresponds to 2
    x corresponds to 1
    z corresponds to 3

    常见迭代工具

    (1)、并行迭代

    >>> names=['jzhou','jason','james']
    >>> ages=[22,42,45]
    >>> for i in range(len(names)):  #i是循环索引
        print names[1],'is',ages[i],'years old'
        
    jason is 22 years old
    jason is 42 years old
    jason is 45 years old

    内建的zip函数可以进行并行迭代,并可以把两个序列“压缩”在一起,然后返回一个元素的列表

    >>> for name,age in zip(names,ages):  #在循环中解包元组
        print name,'is',age,'years old'
       
    jzhou is 22 years old
    jason is 42 years old
    james is 45 years old
    # zip函数可以作用于任意多的序列,并且可以应付不等长的序列,最短的序列“用完”则停止
    >>> zip(range(5),xrange(10000)) [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
    #注意:这里最好不要用range,因为range函数一次创建整个序列,而xrange一次只创建一个数。当需要迭代一个巨大的序列时,无疑xrange更高效。即此例中,使用xrange,序列只创建前5个数,而使用range则创建10000个,而我们只需要5个

    (2)、翻转和排序迭代

    >>> sorted([4,3,6,8,3])
    [3, 3, 4, 6, 8]
    >>> sorted('hello,python!')
    ['!', ',', 'e', 'h', 'h', 'l', 'l', 'n', 'o', 'o', 'p', 't', 'y']
    >>> list(reversed ('hello,world!'))
    ['!', 'd', 'l', 'r', 'o', 'w', ',', 'o', 'l', 'l', 'e', 'h']
    >>> ''.join(reversed('Hello,world!'))
    '!dlrow,olleH'

    reversed和sorted函数和列表的reverse和sort函数类似

    跳出循环

    (1)、break——退出循环

    >>> from math import sqrt
    >>> for n in range(99,0,-1):
        root=sqrt(n)
        if root==int(root):
            print n
            break
        
    81

    设置range的步长(第三个参数)也可以进行迭代

    >>> range(0,10,2)
    [0, 2, 4, 6, 8]

    (2)、continue——跳出本次循环,继续下轮循环(不常用)

    列表推导式——轻量级循环(列表推导式是利用其它列表创建新列表

    >>> [x*x for x in range(10)]
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

    也可以在循环中加判断条件,如计算能被3整除的数的平方

    >>> [x*x for x in range(10) if x%3==0]
    [0, 9, 36, 81]

    也可以使用双重循环,太强大了

    >>> [(x,y) for x in range(3) for y in range(3)]
    [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

    如果我们用普通方式实现上述的双重循环,则代码显得有点冗余

    >>> result=[]
    >>> for x in range(3):
        for y in range(3):
            result .append((x,y))
            
    >>> result
    [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

    其它语句——pass,del,exec

    (1)、pass

      由于python中空代码块是非法的,所以在什么事都不用做到情况下,可以使用pass作为占位符。(注释和pass语句联合的代替方案是插入字符串,后面笔记会介绍文档字符串)

    (2)、del

    >>> x=1
    >>> del x  #del会移除一个对象的引用,也会移除名字本身
    >>> x   #x被删除后,则不存在
    
    Traceback (most recent call last):
      File "<pyshell#2>", line 1, in <module>
        x
    NameError: name 'x' is not defined
    >>> x=['hello','world']
    >>> y=x  #x和y指向同一个列表
    >>> y[1]='python'
    >>> x
    ['hello', 'python']
    >>> del x  #删除x后,y依然存在,因为删除的只是名称,而不是列表本身的值
    >>> y
    ['hello', 'python']

    (3)、exec

      用来执行储存在字符串或文件中的Python语句

    >>> exec 'a=100'
    >>> a
    100
    >>> exec 'print "hello,world!"'
    hello,world!
    >>> h=['hello']
    >>> w='world'
    >>> exec ('h.append(%s)' % 'w')
    >>> h
    ['hello', 'world']

    >>> str = "for i in range(0,5): print i"
    >>> c = compile(str,'','exec')
    >>> exec c
    0
    1
    2
    3
    4

    (4)eval

      用来计算存储在字符串中的有效Python表达式。

    >>> eval('2*3')
    6
  • 相关阅读:
    转--后台开发人员的技术栈
    hadoop +streaming 排序总结
    python 的tempfile学习
    hadoop学习日志
    shell sort 排序大讨论
    系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
    推荐系统评测指标--准确率(Precision)和召回率(Recall)、F值(F-Measure)
    shell 数组
    leecode第七百四十六题(使用最小花费爬楼梯)
    leecode第四百七十五题(供暖器)
  • 原文地址:https://www.cnblogs.com/zhoujie/p/python5.html
Copyright © 2011-2022 走看看