廖雪峰Python教程梳理

本文概述了Python编程的基础知识,从安装Python到编写第一个程序,深入语法复习,包括变量赋值、除法、字符串处理、列表和元组、循环、字典和集合等。此外,介绍了函数的定义、参数检查、返回值、可变参数和关键字参数。还涵盖了Python的高级特性,如切片、迭代、列表生成式和生成器。文章进一步探讨了函数式编程,如高阶函数、map、reduce和filter。最后,讨论了Python的进程和线程,包括多进程、多线程的概念,以及线程锁和线程局部存储。
摘要由CSDN通过智能技术生成

文章目录

一、不标准前言

C语言适合开发那些追求运行速度、充分发挥硬件性能的程序。而Python是用来编写应用程序的高级编程语言。
除了编写代码外,还需要很多基本的已经写好的东西,来帮助你加快开发进度。高级编程语言通常都会提供一个比较完善的基础代码库,让你能直接调用,除了内置的库外,Python还有大量的第三方库,也就是别人开发的,供你直接使用的东西。当然,如果你开发的代码通过很好的封装,也可以作为第三方库给别人使用。
那Python适合开发哪些类型的应用?
首选是网络应用,包括网站、后台服务等等;
其次是许多日常需要的小工具,包括系统管理员需要的脚本任务等等;
另外就是把其他语言开发的程序再包装起来,方便使用。
python缺点:1、运行速度慢 2、代码不能加密,如果要发布你的python程序实际上就是发布源代码,这一点跟C语言不同,C语言不用发布源代码,只需要把编译后的机器码(也就是你在Windows上常见的xxx.exe文件)发布出去。要从机器码反推出C代码是不可能的,所以,凡是编译型的语言,都没有这个问题,而解释型的语言,则必须把源码发布出去。(不过影响都不大)

二、安装python

官网下载——配置环境变量——命令行“python”是否安装成功
Python解释器有很多,如CPython,IPython,PyPy,Jython,IronPython…其中,当我们从Python官方网站下载并安装好Python 3.x后,我们就直接获得了一个官方版本的解释器:CPython 这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。
CPython是使用最广的Python解释器。教程的所有代码也都在CPython下执行。

三、编写第一个python程序

复习一下如何进入python交互模式:
(1)在命令行下敲python进入,在python交互模式下输入exit()并回车,将回到命令行模式。
(2)直接通过开始菜单选择Python (command line)菜单项,直接进入Python交互模式,但是输入exit()后窗口会直接关闭,不会回到命令行模式。
ps两点注意:
(1)如何在命令行模式下运行一个.py文件:执行python hello.py,注意当前文件路径是否正确。
(2)Python交互模式的代码是输入一行,执行一行,而命令行模式下直接运行.py文件是一次性执行该文件内的所有代码。可见,Python交互模式主要是为了调试Python代码用的,也便于初学者学习,它不是正式运行Python代码的环境!
文本编辑器
推荐微软出品的Visual Studio Code,它是一个精简版的迷你Visual Studio,并且可以跨平台Windows、Mac和Linux通用。(注:不要用Word和Windows自带的记事本。Word保存的不是纯文本文件,而记事本会自作聪明地在文件开始的地方加上几个特殊字符(UTF-8 BOM),结果会导致程序运行出现莫名其妙的错误。)
高效用法:用Python开发程序,完全可以一边在文本编辑器里写代码,一边开一个交互式命令窗口,在写代码的过程中,把部分代码粘到命令行去验证,事半功倍。
Python代码运行助手 - 廖雪峰的官方网站
https://www.liaoxuefeng.com/wiki/1016959663602400/1018877595088352

四、语法复习

(1)对变量赋值x = y

意思是把变量x指向真正的对象,该对象是变量y所指向的。随后对变量y的赋值不影响变量x的指向。
在这里插入图片描述

(2)除法类多一个 // 称“地板除”,结果永远是整数,即使除不尽。
(3)转义字符(2种)、换行符(2种)——练习:打印出以下值
n = 123
f = 456.789
s1 = 'Hello, world'
s2 = 'Hello, \'Adam\''
s3 = r'Hello, "Bart"'
s4 = r'''Hello,
Lisa!'''
(4)str与bytes的转换

字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
bytes类型的数据用带 b‘ 数据 ’ 或者 b“ 数据 ” 表示,如 x = b‘ ABC
要注意区分’ABC’和b’ABC’,前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节
以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:

>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
//综上,纯英文str可以用ASCII编码为bytes,含有中文的str可以用UTF-8编码为bytes,但是含中文str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。

反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:

>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'

如果bytes中包含无法解码的字节,decode()方法会报错;如果bytes中只有一小部分无效的字节,可以传入errors='ignore’忽略错误的字节:

>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
'中'

len()函数,可计算str包含多少个字符,可计算bytes包含多少个字节

>>> len('中文'.encode('utf-8'))
6
//可见,1个中文字符经过utf-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。

我们经常遇到str和bytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。
由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:

#!/usr/bin/env python3  //这是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
# -*- coding: utf-8 -*-//这是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

申明了UTF-8编码并不意味着你的.py文件就是UTF-8编码的,必须并且要确保文本编辑器正在使用UTF-8 without BOM编码:
在这里插入图片描述
如果.py文件本身使用UTF-8编码,并且也申明了# -- coding: utf-8 --,打开命令提示符测试就可以正常显示中文:
在这里插入图片描述

(5)格式化

如何输出格式化的字符串。比如 “亲爱的xxx你好!你xx月的话费是xx,余额是xx” 之类的字符串,而xxx的内容都是根据变量变化的。做法与c一致,用%实现。
在这里插入图片描述
比如

>>> 'Hello, %s' % 'world'
'Hello, world'
>>> print('Her name is %s , and age is %d ' % ('manny',18) )
Her name is manny , and age is 18 

如果你不太确定应该用什么,%s永远起作用,它会把任何数据类型转换为字符串。
如果要打印 % 呢?转义——用 %% 来表示一个 %

>>> 'growth rate: %d %%' % 7
'growth rate: 7 %'

另一种格式化字符串的方法是使用字符串的format()方法,它会用传入的参数依次替换字符串内的占位符{0}、{1}……,不过这种方式写起来比%要麻烦得多:

>>> 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
'Hello, 小明, 成绩提升了 17.1%'
(6)列表list[] 元组tuple()

(0)索引从【0】开始
(1)最后一个元素的索引是 len(列表名)-1,或者直接获取 列表名[-1]、列表名[-2]倒数第二个…
(2)list里面的元素的数据类型可以不同
(3)list是一个可变的有序表,可以往list中追加元素到末尾:

>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']

也可以把元素插入到指定的位置,比如索引号为1的位置:

>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']

要删除指定位置的元素,用pop(i)方法,其中i是索引位置:
删除末尾一个:pop()

>>> classmates.pop(1)
'Jack'
>>> classmates
['Michael', 'Bob', 'Tracy','Adam']

要把某个元素替换成别的元素,可以直接赋值给对应的索引位置。

list元素也可以是另一个list,即把s看作一个二维数组,如下:

>>> s = ['python', 'java', ['asp', 'php'], 'scheme']
>>> len(s)
4

要拿到’php’,写做s[2][1] (时刻注意索引从0开始!!!)

那么元组tuple呢?
tuple和list非常类似,但是tuple一旦初始化就不能修改,只可以获取元素数据。
不可变的tuple有什么意义?
因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。
tuple的陷阱:
当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来,即每个都赋值。
如果定义一个空的tuple: t =()
如果定义只有1个元素的tuple:t = (1,) 逗号消除歧义。
一个可变的情况?

>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])

即 tuple中含有一个list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向’a’,就不能改成指向’b’,指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的
理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。

(7)循环 for…in… 与range()
names = ['Michael', 'Bob', 'Tracy']
for x in names:
    print(x)
会依次打印names的每一个元素:
Michael
Bob
Tracy

Python提供一个range()函数,可以生成一个整数序列,再通过list()函数可以转换为list。比如range(5)生成的序列是从0开始小于5的整数:

>>> list(range(5))
[0, 1, 2, 3, 4]

注意,不要滥用break和continue语句。break和continue会造成代码执行逻辑分叉过多,容易出错。大多数循环并不需要用到break和continue语句。有时代码有问题,会让程序陷入“死循环”,也就是永远循环下去。这时可以用Ctrl+C退出程序,或者强制结束Python进程。

(8)dict {} 和 set ( [ 1,2,3 ] )

(1)dictionary字典,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。每组一对数据,查找快速。其中“索引”责任的值称“Key”,注意dict内部存放的顺序和key放入的顺序是没有关系的。

d = {'Michael': 95,'Tracy': 85}  //直接赋值

和list比较,dict有以下几个特点:
查找和插入的速度极快,不会随着key的增加而变慢;
需要占用大量的内存,内存浪费多。
而list相反:
查找和插入的时间随着元素的增加而增加;
占用空间小,浪费内存很少。

使用dict非常重要,牢记dict的key必须是不可变对象。这是因为dict根据key来计算value的存储位置,这个通过key计算位置的算法称为哈希算法(Hash)。要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key。
(2)set 和dict类似,也是一组key的集合,但不存储value。
要创建一个set,需要提供一个list作为输入集合:

>>> s = set([1, 2, 3])   
>>> s
{1, 2, 3}  //注意用的是什么括号,而显示的{1, 2, 3}只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的

使用dict和set https://www.liaoxuefeng.com/wiki/1016959663602400/1017104324028448

五、函数

(1)自行命名函数名
>>> a = max(1,2,3)
>>> a 
3
(2)定义函数 def

(1)格式(定义一个绝对值函数)

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

(2)一个空

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值