第一章 认识Python

“Python是什么?” 用一句著名的话来解释:“人生苦短,我用Python。”
当然这只是一个段子,认真点讲,官方介绍:“Python是一种易于学习,强大的编程语言。 它具有高效的高级数据结构和面向对象编程的简单而有效的方法。 Python的优雅语法和动态类型,以及其解释性质,使其成为在大多数平台上的许多领域的脚本和快速应用程序开发的理想语言。” 总结来说你学会了Python以后,你可以开发部署一个web站点、可以在移动设备上做动态化、毫不费劲的构建GUI。


安装Python

在开始学习之前,我们要确保计算机已经安装了Python解释器。本例都采用Python3来进行学习。在命令窗口使用:

python3 -v

来检测是否安装并且配置了环境变量,如果你的计算机没有安装Python,可以从 https://www.python.org来下载安装。记得选Python3版本,关于windows的配置,读者可网上自行搜索方法(没有环境的,快去安装吧,我会在这里等你)。

等候中...

安装配置成功后,会发现安装目录里有一个IDLE,这是Python的集成开发环境,IDLE包括一个能够利用颜色突出语法的编辑器、一个调试工具、Python Shell,以及一个完整的Python3在线文档集。


第一行Python

打开IDLE,会看到>>>的提示符,在提示符后面输入:

print('Hello Python')

你已经猜到了,我们会输入类似hello world的东西,如果你在IDLE上看到输出,说明你的第一行Python代码成功了。这里简单说明一下:print()是Python的BIF(built-in functions)也就是我们编程常说的内置函数。
Python为我们提供了大概超过70个BIF,你可以在IDLE里输入:

dir(__builtins__)

来查看Python有哪些BIF,注意:括号里的下划线是前后都有两个,不要敲错了。如果你在IDLE里看到一大堆类似数组包裹的英文单词集合,那说明你成功了。

>>> dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']
>>> 

如果你想了解某个功能,继续输入:

help(sum) 

随后就会返回sum函数相关的描述信息。

>>> help(sum)
Help on built-in function sum in module builtins:

sum(iterable, start=0, /)
    Return the sum of a 'start' value (default: 0) plus an iterable of numbers
    
    When the iterable is empty, return the start value.
    This function is intended specifically for use with numeric values and may
    reject non-numeric types.
>>>

这里再说明一下IDLE便捷使用方法
1.快捷选择BIF:输入pr(print的前两个字母)然后按tab,将会出现代码提示,按空上下光标选择,格键选中要使用的BIF或变量。
2.快速切换代码:Mac上使用Ctrl+P可以回退上一行代码,使用Ctrl+N可以前进到下一行代码,在Windows上需要使用Alt+P和Alt+N。还有一些其他属性设置,有兴趣的同学自行尝试。


创建Python列表

下面我们来学习如何用Python创建和处理列表数据。假设我们现在有一些书籍清单:Java编程思想,Android开发详解,HTML5技术探索。现在我们用Python将他们收集起来:

books = ['Java编程思想','Android开发详解','HTML5技术探索']

然后调用打印:

print(books)

不出意外IDLE将会输出:

>>> print(books)
['Java编程思想', 'Android开发详解', 'HTML5技术探索']
>>> 

如果你学过其它编程语言,你肯定会问,books为什么没有变量标识符类型?没错,Python就是这么简易,无需指定数据类型,只需要给出一个自定义的名称标识符,按照Python格式来书写,就可以得到一个数据变量/集合。


查询Python列表数据

我们继续学习,现在我们已经有了集合,想得到某一个值怎么做呢?你只需要像这样:

print(books[0])

输出:

>>> print(books[0])
Java编程思想
>>> 

非常的简单,Python和大多语言一样,集合的索引是从0开始的。如果想取最后一个值如何做?先不要往下看,你自己先试试(记得用快捷键,切回上一行代码):

print(books[2])

没错,如果我们知道数据长度,可以这么书写,就能得到正确的值。除此之外还有一种方式也可以做到:

print(books[-1])

这样Python就会从最后一位开始查询数据:

>>> print(books[-1])
HTML5技术探索
>>> 

这里简单说一下异常相关,如果你输入了不存在的索引,那么IDLE会无情的抛出:

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

以后如果看到 list index out of range 就知道是索引越界了。


修改Python列表数据

刚才我们创建了3本书,现在需要多增加一本,如何去做?如果你选择重新创建一个列表也是一种办法。不过我们今天不打算这么做。我们来尝试用列表自带的函数来处理:

books.append('iOS设计模式')

记得用快捷键:TAB(输入books.app然后TAB,选择append,空格,这是最后一次友情提示)

>>> print(books)
['Java编程思想', 'Android开发详解', 'HTML5技术探索', 'iOS设计模式']
>>> 

这样就会在列表的最后追加一条记录了。除了append()我们还可以使用:

books.insert(0,'C++入门')

insert(index,data)在指定位置插入一条记录。

>>> print(books)
['C++入门', 'Java编程思想', 'Android开发详解', 'HTML5技术探索', 'iOS设计模式']
>>> 

这样就成功的将C++入门插入到记录最开始的位置。
如果列表只是这样,那就没什么特点了,Python的列表不仅仅可以添加相同类型的数据类型,它是支持混合类型的,利用刚才学习的函数,我们现在要给每本书增加一个价格:

books.insert(1,50.9);
>>> books.insert(1,50.9)
>>> print(books)
['C++入门', 50.9, 'Java编程思想', 'Android开发详解', 'HTML5技术探索', 'iOS设计模式']
>>> 

Python就是这么神奇,可以将不同类型的数据存放在一起!后面还有几本书,我们继续添加价格:

books.insert(3,60.5)

注意,添加完成之后,要重新计算后面的位置,确保所有的价格在书籍的后面,不要添加错了。这里有个小技巧,最后一个直接使用append()

  编码中...

很遗憾,我刚才添加倒数第二个书籍的价格计算错误,导致数据变成了如下:

>>> books.insert(6,78.9)
>>> print(books)
['C++入门', 50.9, 'Java编程思想', 60.5, 'Android开发详解', 76.5, 78.9, 'HTML5技术探索', 'iOS设计模式', 88.3]
>>> 

恭喜你已经看了50%,喝杯java适当休息一下吧。


删除Python列表数据

不过不用担心,列表还提供了删除的方法来帮我们修正这些问题:

books.pop(6)
>>> books.pop(6)
78.9
>>> print(books)
['C++入门', 50.9, 'Java编程思想', 60.5, 'Android开发详解', 76.5, 'HTML5技术探索', 'iOS设计模式', 88.3]
>>> 

如果成功删除(弹出),IDLE会自动打印被删掉(弹出)的数据,除此之外还有一种更简单的方式:

books.remove(78.9)

使用remove(value)来删除数据,前提是该数据确实存在,否则就会得到一个无情的错误提示。删掉数据之后,我们就可以重新添加记录了。
还有别的方式来修改错误的数据,想想看如何做?答案结尾揭晓(现在别看)。


循环Python列表数据

前面提到,如果想输出列表中的数据,使用list[index],这种方式固然简单,但是我们想打印所有的数据怎么办?如果有100条,那岂不是要输出100个print?显然Python已经帮我们想到了,是时候开始迭代了!
Python通过内置的for来完成循环,来个栗子:

for value in values:
  #do something

for...in...:这种写法就是Python的for循环结构。每次循环values就会将当前索引下的值赋给value,然后我们可以对value来做操作,下面来试试:

for book in books:
    print(book)
>>> for book in books:
    print(book)

    
C++入门
50.9
Java编程思想
60.5
Android开发详解
76.5
HTML5技术探索
78.9
iOS设计模式
88.3
>>> 

怎么样,是不是很cool,除了for...in形式的循环,Python还提供了while循环:

index = 0
while index < len(books):
  print(books[index])
  index += 1

结果和上面for是一样的,我就不贴出来了。细心的你可能已经发现我们使用了一个新的BIF --- len(obj)。这个函数是可以获取传入对象的长度。
至于用for还是while,具体要看实际应用。我的建议是优先使用for,它可以自动的从列表起始到结束,而使用while你需要单独控制索引来处理,很可能会漏掉一条数据。当然除非你需要while循环提供额外控制的话。


Python列表中的列表

前面提到列表是一个数据的集合,它不关心内部是数据类型,那么我们可以将列表存放在列表内,现在我们来改造一下books列表:

books = ['C++入门', 50.9, 
         'Java编程思想', 60.5,
         'Android开发详解', 76.5,
         'HTML5技术探索', 78.9, 
         'iOS设计模式', 88.3]

先回忆下之前的列表,之前的列表是书籍和价格混合在一起,不太好看我们来改造一下:

>>> books = [['C++入门', 50.9], 
             ['Java编程思想', 60.5],
             ['Android开发详解', 76.5],
             ['HTML5技术探索', 78.9], 
             ['iOS设计模式', 88.3]]

现在列表按照[书籍,价格]的结构来设计,看起来清晰一些。看来列表嵌套列表Python也是支持的。这时候我们再对列表数据进行调整,现在我们需要按照出版社来归类书籍,即:一个出版社对应多个书籍。继续改造。

忙碌中...

数据改造完成,我们看看效果:

books = [['机械工业出版社',['C++入门', 50.9],['Java编程思想', 60.5]],
         ['人民邮电出版社',['Android开发详解', 76.5],['HTML5技术探索', 78.9]],
         ['中国电力出版社' ,['iOS设计模式', 88.3]]]

看起来有些复杂,我们循环打印下结果:

>>> for book in books:
    print(book)    

['机械工业出版社', ['C++入门', 50.9], ['Java编程思想', 60.5]]
['人民邮电出版社', ['Android开发详解', 76.5], ['HTML5技术探索', 78.9]]
['中国电力出版社', ['iOS设计模式', 88.3]]
>>> 


Python中使用条件判断

上面的列表好像就少了一层[]而已,如果想继续打印内部的怎么办呢?我们应该在循环的内做一个判断,如果是列表就继续循环,否则就打印输出。这时候该使用if-else结构了

if ... :
  #do if
else:
  #do else

来尝试改下for的打印:

>>> for book in books:
    if isinstance(book,list):
        for b in book:
            print(b)
    else: print(book)

机械工业出版社
['C++入门', 50.9]
['Java编程思想', 60.5]
人民邮电出版社
['Android开发详解', 76.5]
['HTML5技术探索', 78.9]
中国电力出版社
['iOS设计模式', 88.3]
>>> 

现在看来是清晰了不少。这里用到一个BIF --- isinstance(obj,class)函数,它的作用是来检查某个特定的标识符是否包含某个特定的类型的数据。

但是书籍和价格还是一个列表,现在需要再循环一次:

>>> for book in books:
    if isinstance(book,list):
        for b in book:
            if isinstance(b,list):
                for b1 in b:
                    print(b1)
            else:
                print(b)
    else:
        print(book)

机械工业出版社
C++入门
50.9
Java编程思想
60.5
人民邮电出版社
Android开发详解
76.5
HTML5技术探索
78.9
中国电力出版社
iOS设计模式
88.3
>>> 

终于把所有的列表都循环出来了。但是这个代码量无法接受。经过分析其实最里面的if和外层的if条件是一样的,如你所想接下来就要请出函数了。


Python中创建函数

使用Python创建函数很简单,使用关键字:

def 函数名 (参数):
    #do something

我们来将刚才冗长的for+if用函数来封装试试:

>>> def get_book(books):
    for book in books:
        if isinstance(book,list):
            get_book(book)
        else:
            print(book)
>>>

是不是很简答,我只需要在最开始的for循环最上面加上函数的创建规则,然后在if条件中调用自身,这样就可以完成递归调用,我们来调用函数,将books传入看结果如何:

>>> get_book(books)
机械工业出版社
C++入门
50.9
Java编程思想
60.5
人民邮电出版社
Android开发详解
76.5
HTML5技术探索
78.9
中国电力出版社
iOS设计模式
88.3
>>>

结果正和我们预想的一样。掌握了函数这个功能,我们又能开心、轻松的编程了。


总结

我们今天学习了:

  • 使用Python的print()函数打印信息。
  • 不需要指定标识符类型就能创建出变量、列表。
  • 查询列表、修改列表(list.append()、list.insert())、删除列表(list.remove())、列表嵌套。
  • for循环、while循环。
  • if: else:条件判断。
  • 使用def创建函数。
  • 学习了几个函数:
len()
isinstance()

还有最重要的一点,即使上面的都忘记了也没关系。一定要记住使用:

dir(__builtins__)

然后在搭配:

help(func)

来查阅函数文档。


答案揭晓

你要自己思考、尝试后才可以看这里。
这里是刚才的那个列表。

>>> print(books)
['C++入门', 50.9, 'Java编程思想', 60.5, 'Android开发详解', 76.5, 78.9, 'HTML5技
术探索', 'iOS设计模式', 88.3]
>>>

我们直接给相应的数据用索引查到,然后赋值即可:

>>> books[6] = 'HTML5技术探索'
>>> books[7] = 78.9
>>> print(books)
['C++入门', 50.9, 'Java编程思想', 60.5, 'Android开发详解', 76.5, 'HTML5技术探索', 78.9, 'iOS设计模式', 88.3]
>>> 

相信你已经想到答案了


今天的Python之旅就到这里了,如果大家喜欢请点赞、收藏,我会继续更新后面的章节。


恭喜你达成成就。


你可能感兴趣的:(第一章 认识Python)