文章目录
一、不标准前言
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)一个空