南大慕课《用Python玩转数据》-02Python面面观

作者: 花开花落花满天 | 来源:发表于2016-04-28 21:27 被阅读0次

    本章主要涉及选择结构、循环结构和自定义函数等内容。

    2.1 条件

    1. if 语句

    2. else语句

    3. elif语句

    4. 条件嵌套

    注意下面代码的语法

    k = raw_input('input the index of shape:')
    if k == '1':
     print 'circle'
    elif k == '2':
     print 'oval'
    elif k == '3':
     sd1 = int(raw_input('the first side:'))
     sd2 = int(raw_input('the second side:'))
     if sd1 == sd2:
         print "the square's area is:%d" %(sd1*sd2)
     else:
         print "the rectangle's area is:%d" %(sd1*sd2)
     print 'rectangle'
    elif k == '4':
     print 'triangle'
    else:
     print 'you input the invalid number'
    

    2.2 range和xrange

    可以产生一组有规律的数字,常用在循环结构中。

    1. 语法

    range(start,end,step=1) #不包括end
    range(start,end) #默认步长为1,不包括end
    range(end) #默认从0开始

    xrange语法与range是一样的。

    2. range与xrange的异同

    .



    xrange 更节省内存,因为它的返回值是一种生成器(一种特殊的迭代器),更适合处理大数据量。

    3. python3.0中的变化

    在python 3当中已没有xrange函数了,python 2 中 xrange函数,在python3 中是range(),python 2中的range函数,在python 3 中需要显式调用 ,如 list(range(10))

    4. 代码示例

    print range(3,12,2) #输出:  [3, 5, 7, 9, 11]
    print range(3,12) #输出:  [3, 4, 5, 6, 7, 8, 9, 10, 11]
    print range(6) #输出:  [0, 1, 2, 3, 4, 5]
    print xrange(6) #输出:  xrange(6)
    print list(xrange(6)) #输出:  [0, 1, 2, 3, 4, 5]
    
    for i in xrange(3,11,2):
        print "xrange %d" %i
    for i1 in range(3,11,2):
        print "range %d" %i1
    

    上述的输出结果为

    xrange 3
    xrange 5
    xrange 7
    xrange 9
    range 3
    range 5
    range 7
    range 9

    2.3 循环

    1. while循环

    sumA = 0
    j = 1
    while j < 5:
        print "j:%d" %j
        sumA += j
        j +=1
    print "sumA:%d" %sumA
    

    输出结果为

    j:1
    j:2
    j:3
    j:4
    sumA:10

    2. for 循环

    语法

    for iter_var in iterable_object:
    suite_to_repeat

    iterable_object(可迭代的对象),包含了如下

    String
    List
    Tuple
    Dictionary
    File

    s = 'python'
    for c in s:
        print c
    

    p
    y
    t
    h
    o
    n

    列表解析 print [i+1 for i in range(10) if i %2 ==0] #输出 [1, 3, 5, 7, 9]
    生成器表达式 print (a+1 for a in range(10) if a %2 ==0) #输出 <generator object <genexpr> at 0x020EF3C8>
    一般数据量比较大的时候,用生成器表达式,数据量不太大的时候,用列表解析。

    2.4 循环中的break,continue和else

    1. break

    质数(prime number)又称素数,有无限个。除了1和它本身以外不再有其他的除数整除。根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积,最小的质数是2。

    # 输出2-100之间的素数
    from math import sqrt
    j = 2
    while j <= 100:
        i = 2
        k = sqrt(j)
        while(i <= k ):
            if j%i == 0:break
            i = i + 1
        if(i > k):
            print j,
        j += 1
    
    from math import sqrt
    for i in range(2,101):
        k = int(sqrt(i)) #获取其平方根
        flag = 1 #每个循环判断前,先默认每个数都是素数,0是合数,1是素数
        for m in range(2,k+1):
            if ( i%m == 0): #发现有能被整除的数
                flag = 0 #设置其为合数
                break #一旦发现有可以被除的数,则终止判断
        if (flag == 1): #如果该数是素数
            print i, #添加了一个逗号后,打印的数如下,不换行
    

    输出:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
    为什么是平方根:如果一个数不是素数是合数, 那么一定可以由两个自然数相乘得到, 其中一个大于或等于它的平方根,一个小于或等于它的平方根。并且成对出现。

    问题:

    i = 1
    while(i % 3): 
        print i,
        if (i >= 10):
            break
        i += 1
    

    A.1 2 4 5 7 8 #只列出了这个容易错误的选项,注意当循环到3的时候,while内的结果就是false了,会跳出循环,不会继续循环 后面的4-10
    D.1 2 #正确答案

    2. continue语句

    • 在while 和 for 循环中,continue语句的作用是
      • 停止当前循环,重新进入新的循环(break是终止整个循环)
      • while循环是判断循环条件是否满足
      • for 循环是判断迭代是否结束
    #输出结果为 从3到101的奇数,因为遇到偶数会被整除,通过continue会跳过循环
    sumA = 0
    i = 1
    while i <= 100:
        sumA += i
        i += 1
        if (i % 2 == 0):
            continue
        print "i=%d,sum=%d" %(i,sumA)
    

    3. 循环中的else语句

    • 如果循环代码从break处终止,则跳出循环
    • 正常结束循环的话,则执行else中的代码
    # case1: 这个程序满足if条件,则break跳出循环,不执行else语句
    for i in range(1,10):
        if i > 5:
            print("程序终止,执行到了第 %d 次" %i) #如果满足if条件,则break跳出循环
            break
    else:
        print ("程序被执行到了第 %d 次" %i) #正常结束时被调用
    
     # case2: 这个程序不会满足if内的条件,会正常结束for循环,然后走到else中
    for i in range(1,10):
        if i > 100:
            print("程序终止,执行到了第 %d 次" %i) #如果满足if条件,则break跳出循环
            break
    else:
        print ("程序被执行到了第 %d 次" %i) #正常结束时被调用
    

    case1输出结果为: 程序终止,执行到了第 6 次
    case2输出结果为: 程序被执行到了第 9 次

    2.5 自定义函数

    1. 自定义函数的创建

    def addMe2Me(x):    #def funcation_name([arguments])
          'apply operation + to argument'    #optional documentation string
          return (x + x)    #function_suite
    print addMe2Me(3.7)    #调用自定义函数
    

    ' ' 中成为DocString,是一个函数的注释,如果要看一个函数的DocString,要使用:print fn.__doc__

    2.默认参数(1)

    函数可以有个默认值,在函数定义中,默认参数以赋值语句的形式提供

    def f(x = True):
        "whether x is a correct word or not"
        if x:
            print 'x is a correct word'
        print 'OK'
        
    print f() #
    print f(False)#
    

    x is a correct word
    OK
    OK

    3.默认参数(2)

    传递多个参数,只有一个参数有默认值。python中规定,默认参数放在参数列表的最后。

    def f(x, y=True):
    print f(68) # x为68,y为默认值true
    print f(68,False)

    • 关键字参数
    def f(x,y)
    f(68,False) #这个叫做位置参数,即参数的传入顺序与函数定义中的相同
    f(y = False,x = 68) #允许改变参数列表中的参数顺序,但是必须要使用参数名区分。这种叫做关键字参数
    f(y = False,68) #☓这种写法是错误的,一旦使用了关键字参数,就全部要带上参数名
    

    4.传递函数

    把函数名当中一个普通的参数一样,传递给另一个函数

    def addMe2Me(x):
        return 2*x
    def self(f,y):
        print f(y)
    self(addMe2Me,2.2) #output : 4.4
    

    lamda函数

    ※以后再详细了解※

    2.6 递归

    ※略,以后再补※

    2.7 变量作用域

    global_str = 'hello'
    def foo():
        local_str = 'world'
        return global_str + local_str
    print foo()
    
    def f(x):
        global a   #a是一个全局变量,没有这个global语句强调全局变量的话,程序会报错
        print a
        a = 5
        print a + x
    a = 3
    f(8)
    print a
    

    3 #这是输出结果
    13
    5

    测验部分

    • 如下面的代码,输出结果是11,lamda函数/函数参数 都有体现
    def test(f, a, b): 
        print(f(a, b))
    test((lambda x,y: x ** 3 + y), 2, 3)
    
    • 找前5个默尼森数。P是素数且M也是素数,并且满足等式M=2P-1,则称M为默尼森数。例如,P=5,M=2P-1=31,5和31都是素数,因此31是默尼森数。
    from math import sqrt
    
    # python 2.7
    # 判断一个数是否是素数的函数
    def isPrime(i):
        k = int(sqrt(i))    #获取其平方根
        flag = 1 #每个循环判断前,先默认每个数都是素数,0是合数,1是素数
        for m in range(2,k+1):
            if (i%m == 0):
                flag = 0 #设置为合数
                return 0 #返回不是素数
                break #一旦发现有可以被除的数,终止判断
        if (flag == 1):
                #print"%d is a prime" %i
                return 1 #返回是素数
                
    #找出NumMax 个默尼森数
    def searchMonisen(NumMax):
        num = 0 # 用来给找到的默尼森数 计数
        x = 2 # 素数2开始寻找
        while (num < NumMax):
            if ( isPrime(x) == 1):
                m = 2**x-1 #用来寻找 默尼森数
                if ( isPrime(m) == 1):
                    print "%d is a monisen" %m
                    num += 1
            x += 1
    
    #调用函数,找出前5个默尼森数
    searchMonisen(5)
    
    

    TODO

    1. 生成器/迭代器 的概念
    2. 列表解析 / 生成器表达式
    3. 递归
    4. lamda函数
    5. is 和 == 运算符的差别

    相关文章

      网友评论

        本文标题:南大慕课《用Python玩转数据》-02Python面面观

        本文链接:https://www.haomeiwen.com/subject/dcccrttx.html