为了账号安全,请及时绑定邮箱和手机立即绑定
慕课网数字资源数据库体验端
初识Python_学习笔记_慕课网
为了账号安全,请及时绑定邮箱和手机立即绑定

初识Python

廖雪峰 移动开发工程师
难度入门
时长 5小时 0分
  • 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

    我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可以看出:

    fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = 
    (n-1)! * n = fact(n-1) * n

    所以,fact(n)可以表示为 n * fact(n-1),只有n=1时需要特殊处理。

    于是,fact(n)用递归的方式写出来就是:

    def fact(n):
        if n==1:
            return 1
        return n * fact(n - 1)

    上面就是一个递归函数。

    如果我们计算fact(5),可以根据函数定义看到计算过程如下:

    ===> fact(5)
    ===> 5 * fact(4)
    ===> 5 * (4 * fact(3))
    ===> 5 * (4 * (3 * fact(2)))
    ===> 5 * (4 * (3 * (2 * fact(1))))
    ===> 5 * (4 * (3 * (2 * 1)))
    ===> 5 * (4 * (3 * 2))
    ===> 5 * (4 * 6)
    ===> 5 * 24
    ===> 120

    递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

    使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

    任务

    汉诺塔 (http://baike.baidu.com/view/191666.htm) 的移动也可以看做是递归函数。

    我们对柱子编号为a, b, c,将所有圆盘从a移到c可以描述为:

    如果a只有一个圆盘,可以直接移动到c;

    如果a有N个圆盘,可以看成a有1个圆盘(底盘) + (N-1)个圆盘,首先需要把 (N-1) 个圆盘移动到 b,然后,将 a的最后一个圆盘移动到c,再将b的(N-1)个圆盘移动到c。

    请编写一个函数,给定输入 n, a, b, c,打印出移动的步骤:

    move(n, a, b, c)

    例如,输入 move(2, 'A', 'B', 'C'),打印出:

    A --> B
    A --> C
    B --> C

    函数 move(n, a, b, c) 的定义是将 n 个圆盘从 a 借助 b 移动到 c。

    参考代码:

    def move(n, a, b, c):
        if n ==1:
            print a, '-->', c
            return
        move(n-1, a, c, b)
        print a, '-->', c
        move(n-1, b, a, c)
    move(4, 'A', 'B', 'C')


    查看全部
  • 站出来。

    要写代码完成这个任务,我们可以先数一数这个 list,发现它包含3个元素,因此,最后一个元素的索引是2:

    >>> print L[2]
    Bart

    有没有更简单的方法?

    有!

    Bart同学是最后一名,俗称倒数第一,所以,我们可以用 -1 这个索引来表示最后一个元素:

    >>> print L[-1]
    Bart

    Bart同学表示躺枪。

    类似的,倒数第二用 -2 表示,倒数第三用 -3 表示,倒数第四用 -4 表示:

    >>> print L[-2]
    Lisa
    >>> print L[-3]
    Adam


    查看全部
  • 由于list是一个有序集合,所以,我们可以用一个list按分数从高到低表示出班里的3个同学:

    >>> L = ['Adam', 'Lisa', 'Bart']

    那我们如何从list中获取指定第 N 名的同学呢?方法是通过索引来获取list中的指定元素。

    需要特别注意的是,索引从 0 开始,也就是说,第一个元素的索引是0,第二个元素的索引是1,以此类推。

    因此,要打印第一名同学的名字,用 L[0]:

    >>> print L[0]
    Adam

    要打印第二名同学的名字,用 L[1]:

    >>> print L[1]
    Lisa

    要打印第三名同学的名字,用 L[2]:

    >>> print L[2]
    Bart

    要打印第四名同学的名字,用 L[3]:

    >>> print L[3]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: list index out of range

    报错了!IndexError意思就是索引超出了范围,因为上面的list只有3个元素,有效的索引是 0,1,2。

    所以,使用索引时,千万注意不要越界。


    查看全部
  • Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。

    比如,列出班里所有同学的名字,就可以用一个list表示:

    >>> ['Michael', 'Bob', 'Tracy']
    ['Michael', 'Bob', 'Tracy']

    list是数学意义上的有序集合,也就是说,list中的元素是按照顺序排列的。

    构造list非常简单,按照上面的代码,直接用 [ ] 把list的所有元素都括起来,就是一个list对象。通常,我们会把list赋值给一个变量,这样,就可以通过变量来引用list:

    >>> classmates = ['Michael', 'Bob', 'Tracy']
    >>> classmates # 打印classmates变量的内容
    ['Michael', 'Bob', 'Tracy']

    由于Python是动态语言,所以list中包含的元素并不要求都必须是同一种数据类型,我们完全可以在list中包含各种数据:

    >>> L = ['Michael', 100, True]

    一个元素也没有的list,就是空list:

    >>> empty_list = []


    查看全部
    0 采集 收起 来源:Python创建list

    2019-09-17

  • 函数可以返回多个值吗?答案是肯定的。

    比如在游戏中经常需要从一个点移动到另一个点,给出坐标、位移和角度,就可以计算出新的坐标:

    # math包提供了sin()和 cos()函数,我们先用import引用它:

    import math
    def move(x, y, step, angle):
        nx = x + step * math.cos(angle)
        ny = y - step * math.sin(angle)
        return nx, ny

    这样我们就可以同时获得返回值:

    >>> x, y = move(100, 100, 60, math.pi / 6)
    >>> print x, y
    151.961524227 70.0

    但其实这只是一种假象,Python函数返回的仍然是单一值:

    >>> r = move(100, 100, 60, math.pi / 6)
    >>> print r
    (151.96152422706632, 70.0)

    用print打印返回结果,原来返回值是一个tuple!

    但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。


    查看全部
  • sum = 0
    x = 1
    n = 1
    while True:
        sum=sum+x
        x=x*2
        n=n+1
        if n>20:
        break
    print sum

    哪里出错了

    查看全部
  • 在Python中,定义一个函数要使用 def 语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回。

    我们以自定义一个求绝对值的 my_abs 函数为例:

    def my_abs(x):
        if x >= 0:
            return x    
        else:
            return -x

    请注意,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。

    如果没有return语句,函数执行完毕后也会返回结果,只是结果为 None。

    return None可以简写为return。


    查看全部
  • Python内置了很多有用的函数,我们可以直接调用。

    要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数 abs,它接收一个参数。

    可以直接从Python的官方网站查看文档:
    http://docs.python.org/2/library/functions.html#abs

    也可以在交互式命令行通过 help(abs) 查看abs函数的帮助信息。

    调用 abs 函数:

    >>> abs(100)
    100
    >>> abs(-20)
    20
    >>> abs(12.34)
    12.34

    调用函数的时候,如果传入的参数数量不对,会报TypeError的错误,并且Python会明确地告诉你:abs()有且仅有1个参数,但给出了两个。

    如果传入的参数数量是对的,但参数类型不能被函数所接受,也会报TypeError的错误,并且给出错误信息:str是错误的参数类型。

    而比较函数 cmp(x, y) 就需要两个参数,如果 x<y,返回 -1,如果 x==y,返回 0,如果 x>y,返回 1:

    >>> cmp(1, 2)
    -1
    >>> cmp(2, 1)
    1
    >>> cmp(3, 3)
    0

    Python内置的常用函数还包括数据类型转换函数,比如   int()函数可以把其他数据类型转换为整数:

    >>> int('123')
    123
    >>> int(12.34)
    12

    str()函数把其他类型转换成 str:

    >>> str(123)
    '123'
    >>> str(1.23)
    '1.23'


    查看全部
  • 我们已经了解了Python支持布尔类型的数据,布尔类型只有TrueFalse两种值,但是布尔类型有以下几种运算:

    与运算:只有两个布尔值都为 True 时,计算结果才为 True。

    True and True   # ==> True
    True and False   # ==> False
    False and True   # ==> False
    False and False   # ==> False

    或运算:只要有一个布尔值为 True,计算结果就是 True。

    True or True   # ==> True
    True or False   # ==> True
    False or True   # ==> True
    False or False   # ==> False

    非运算:把True变为False,或者把False变为True:

    not True   # ==> False
    not False   # ==> True

    布尔运算在计算机中用来做条件判断,根据计算结果为True或者False,计算机可以自动执行不同的后续代码。

    在Python中,布尔类型还可以与其他数据类型做 and、or和not运算,请看下面的代码:

    a = True
    print a and 'a=T' or 'a=F'

    计算结果不是布尔类型,而是字符串 'a=T',这是为什么呢?

    因为Python把0空字符串''None看成 False,其他数值和非空字符串都看成 True,所以:

    True and 'a=T' 计算结果是 'a=T'
    继续计算 'a=T' or 'a=F' 计算结果还是 'a=T'

    要解释上述结果,又涉及到 and 和 or 运算的一条重要法则:短路计算。

    1. 在计算 a and b 时,如果 a 是 False,则根据与运算法则,整个结果必定为 False,因此返回 a;如果 a 是 True,则整个计算结果必定取决与 b,因此返回 b。

    2. 在计算 a or b 时,如果 a 是 True,则根据或运算法则,整个计算结果必定为 True,因此返回 a;如果 a 是 False,则整个计算结果必定取决于 b,因此返回 b。

    所以Python解释器在做布尔运算时,只要能提前确定计算结果,它就不会往后算了,直接返回结果。


    查看全部
  • 注意: 集合是指包含一组元素的数据结构,我们已经介绍的包括:
    1. 有序集合:list,tuple,str和unicode;
    2. 无序集合:set
    3. 无序集合并且具有 key-value 对:dict

    查看全部
    0 采集 收起 来源:什么是迭代

    2019-09-17

  • 我们知道圆的面积计算公式为:

    S = πr²

    当我们知道半径r的值时,就可以根据公式计算出面积。假设我们需要计算3个不同大小的圆的面积,每次写3.14 * x * x不仅很麻烦,而且,如果要把3.14改成3.14159265359的时候,得全部替换。

    有了函数,我们就不再每次写s = 3.14 * x * x,而是写成更有意义的函数调用 s = area_of_circle(x),而函数 area_of_circle 本身只需要写一次,就可以多次调用。

    抽象是数学中非常常见的概念。举个例子:

    计算数列的和,比如:1 + 2 + 3 + ... + 100,写起来十分不方便,于是数学家发明了求和符号∑。

    这种抽象记法非常强大,因为我们看到∑就可以理解成求和,而不是还原成低级的加法运算。而且,这种抽象记法是可扩展的。

    可见,借助抽象,我们才能不关心底层的具体计算过程,而直接在更高的层次上思考问题。

    写计算机程序也是一样,函数就是最基本的一种代码抽象的方式。

    Python不但能非常灵活地定义函数,而且本身内置了很多有用的函数,可以直接调用。


    查看全部
  • L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3

    查看全部
    0 采集 收起 来源:对list进行切片

    2019-09-17

  • print L[4::5][-10:]

    连续切片。从四开始,每隔五个数取一个,然后再倒叙取出后十个数。

    查看全部
    1 采集 收起 来源:倒序切片

    2019-09-17

  • int()函数的第二个参数是转换进制,如果不传,默认是十进制 (base=10),如果传了,就用传入的参数。

    查看全部
  • 遇到逗号“,”会输出一个空

    查看全部

举报

0/150
提交
取消
课程须知
如果您了解程序设计的基本概念,会简单使用命令行,了解中学数学函数的概念,那么对课程学习会有很大的帮助,让您学起来得心应手,快速进入Python世界。
老师告诉你能学到什么?
通过本课程的学习,您将学会搭建基本的Python开发环境,以函数为基础编写完整的Python代码,熟练掌握Python的基本数据类型以及list和dict的操作。
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!