Python 是一种解释型、面向对象、动态数据类型(弱类型)的高级程序设计语言。
Python 由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。
像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU General Public License) 协议。
官方宣布,2020 年 1 月 1 日, 停止 Python 2 的更新。
Python 2.7 被确定为最后一个 Python 2.x 版本。
Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。
开发工具:Visual Studio Code
1.查询是否安装python3
在Visual Studio Code终端的运行结果
apple@192 python % python3 Python 3.12.1 (v3.12.1:2305ca5144, Dec 7 2023, 17:23:38) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>>
2.cnotrol加Z字退出命令编译状态
在Visual Studio Code终端的运行结果
apple@192 python % python3 Python 3.12.1 (v3.12.1:2305ca5144, Dec 7 2023, 17:23:38) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> zsh: suspended python3 apple@192 python %
clear命令可以在命令行清除屏幕信息,但是在python3命令编译状态下执行clear无效。
3.直接运行.py文件
在在Visual Studio Code终端的命令行执行:python3 test.py
apple@192 python % python3 test.py
Python 在代码编写时,没有大括号约定代码块的边界,而是用缩进来组织,默认为 4 个空格,比如以下 object c 语言的代码:
int a = 1; if(a>0) { print(“a>0”); }else{ print(“a<=0”); }
而在 Python 里面,是没有大括号的,但需要前面缩进 4 个空格表示代码块:
a = 1 # float(input("输入一个数字: ")) if a>0: print('a>0') else: print('a<=0')
打印结果:
a>0
整体缩进:
Tab
整体取消缩进:
Tab + Shift
- Python数据类型
4.1 整数、浮点数
Python 的整数和浮点数与其它语言比较类似,都是通过正常数字表达。
但 Python 允许我们在数字中加下划线 _ 分隔很大的数,比如:十进制 10_000_000_000,十六进制也可以 0xa5b3_c3d。
并且,Python 的整数和浮点数都没有大小限制,但是超过一定范围后(比如:计算机的位数不足以表示这个数)就直接表示为 inf(无限大)。
print(float("inf") > 20000)
打印结果:
True
4.2 字符串
Python 中的字符串用两个单引号 ‘’ 表示,比如 ‘Hello World’。
当字符串内部既包含 ’ 又包含 " 时,可以用转义字符 \ 来标识引号,比如:
‘I’m"OK"!’, 即:I’m “OK”!
Python 还用了 r’’ 表示 ‘’ 内部的字符串默认不转义:
print('\\t\\') #转义时
打印结果:
\t\
print(r'\\\t\\') #不转义时
打印结果:
\\\t\\
如果字符串内部有很多换行,可以用 ‘’‘’‘’ 的格式表示多行内容:
print('''line1 line2 line3''')
打印结果:
line1 line2 line3
多行字符串 ‘’‘’‘’ 还可以在前面加上 r 使用,转义符会失效:
print(r'''hello,\n ...world''')
打印结果:
hello,\n ...world
4.3 布尔值与空值
布尔值
Python 用 True/False 来表示布尔:
print(True) print(False) print(3 > 1) print(3 > 5)
打印结果:
True False True False
布尔值可以用与、或和非(and、or和not表示)运算:
print(True and False) print(True or False) print(not False) print(not 1 > 2)
打印结果:
False True True True
空值
和 Java 中的 null、Go 语言中的 nil 一样,Python 用 None 来表示空值。空值没有数据类型,判断空值:
print(False==None) print(None==None) print(1==None)
打印结果:
False True False
4.4 变量与常量
变量不仅可以是数字,还可以是任意数据类型。变量在程序中用变量名表示,变量名必须是大小写英文、数字和 _ 的组合,且不能用数字开头,比如:
a = 1
t_007 = ‘T007’
Ans = True
注意:和其它固定类型不同,Python 中的变量名可以反复赋值,而且可以是不同数据类型的变量:
a = 123
print(a)
a = ‘ABC’
像 Python 这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如 Go 就是静态语言,赋值语句如下(// 表示注释):
a := 100 // a被定义为整数类型变量
a = “abc” // 报错:不能把字符串赋给整型变量
与 Go、Java 等静态语言相比,Python 作为动态语言更灵活,就是这个原因。
4.5 list 和 tuple
list
和大多数语言一样,list 作为一个列表,表示多个元素组合:
books = ['Chinese', 'Math', 'English'] print(books)
打印结果:
['Chinese', 'Math', 'English']
Python 作为动态语言,一个 list 中的元素可以是不同类型,比如:
l2 = ['Chinese', True, 123] print(l2)
打印结果:
['Chinese', True, 123]
Python 提供了很多数组相关的函数,可以直接使用,如:
len(),获取列表的元素个数;
print(len(l2))
打印结果:
3
append,插入元素到列表的尾端;
l2.append(123456) print(l2)
打印结果:
['Chinese', True, 123, 123456]
insert,插入元素到数组指定位置;由于insert是动态的,当插入的下标超过list的总长度时页能插入到list的尾部
books.insert(2, 12334) print(books) books.insert(10, 1233456) print(books)
打印结果:
['Chinese', 'Math', 12334, 'English'] ['Chinese', 'Math', 12334, 'English', 1233456]
pop,删除指定下标的元素,默认删除尾端元素。若下标大于等于list的总长度就报错
books.pop(4) print(books)
打印结果:
['Chinese', 'Math', 12334, 'English']
tuple
tuple 元组是 Python 中独有的数据结构,表示一组不可变的元素:
classmate = (‘zhangs’, ‘lis’, ‘wangw’)
tuple 没有 append、insert、pop 这样的方法,也没有赋值操作。
不可变的元组 tuple 的意义是:代码更安全。
Python官方说明:如果可能,能用 tuple 代替 list 就尽量用 tuple。
classmate = ('zhangs', 'lis', 'wangw') print(classmate)
打印结果:
('zhangs', 'lis', 'wangw')
4.6 dict 和 set
dict
字典(dict)也叫 map,是存储键值对(key-value,简称 k-v)的数据结构,采用 hash 算法存储数据,具有极快的查找速度。
定义一个 dict,赋值:
d = {} # 存储名字和年龄的映射 d["zhangsan"] = 18 d["lisi"] = 19 print(d)
打印结果
{'zhangsan': 18, 'lisi': 19}
或者:
d = {"zhangsan": 18, "lisi": 19} print(d)
打印结果
{'zhangsan': 18, 'lisi': 19}
当获取 dict 中的 value 值时,可以用 get() 方法:
print(d.get("zhangsan")) print(d['zhangsan'])
打印结果:
18
或者直接用:
print(d['zhangsan'])
打印结果:
18
删除 key 时,用 pop(key) 方法。
d.pop("zhangsan") print(d)
打印结果:
{'lisi': 19}
Python 中使用 dict 需要注意的两点:
如果 key 不存在,d[key] 会报错;
dict 中的 key 必须是不可变对象,如字符串、整型数等等,list 是可变的,所以不能作为 dict 的 key;
d[1] = 20 print(d)
打印结果:
{'lisi': 19, 1: 20}
set集合
set 和 dict 类似,也是无序的数据结构,且重复元素会被自动过滤。
s = set([1, 2, 3, 1, 2]) print(s) # {1,2,3
打印结果:
{'lisi': 19, 1: 20} {1, 2, 3}
set 可以理解为 dict 中的 value 为空的数据结构,在其它语言里,比如 Go 语言里是不存在 set 类型的,要定义一组不重复的元素,只能用 dict 来做。
set 提供了很多操作元素的方法:
add(key),添加元素;
s.add(4) print(s) s.add(3) print(s)
打印结果:
{1, 2, 3, 4} {1, 2, 3, 4}
remove(key),删除元素;
和 dict 一样,set 内部不允许放入可变对象,如 list。若删除的元素不存在会报错
s.remove(3) print(s) s.remove(5) print(s)
打印结果:
{1, 2, 4} Traceback (most recent call last): File "/Users/apple/小鸡科技/工作/python/test.py", line 70, in <module> s.remove(5) KeyError: 5
- 基本操作
5.1 条件判断
和大多数编程语言一样,在Python 中,采用 if-else 来作为条件控制:
age = 3 if age >= 18: print('adult') elif age >= 6: print('teenager') else: print('kid') names = ['b', 'a', 'c']
打印结果:
kid
和其它语言相比,Python 需要注意三点:
判断语句的冒号不能省略;
Python 的条件判断代码块不用大括号 {} 装起来,而是以缩进代码块来判断(VsCode 中可以采用 tab 键和 shift+tab 键调节缩进);
新增 elif 代替 else if 语句。
5.2 循环
Python 有两种循环 for 和 while。
for 循环循环打印列表里的元素:
sum = 0 for x in range(101): sum = sum+x print(sum) #5050 注意:实际是0~100的和
打印结果:
5050
Python 中自带的 range(n) 方法,可以生成列表 [0, 2, …, n-1],注意编码是从0开始倒n-1,不包括n,n大于等于1
s1 = range(30) print(s1) print(len(s1))
打印结果:
range(0, 30) 30
while 循环
只有条件满足,就不断循环,只到不满足条件时退出。比如计算 100 以内的所有奇数之和:
sum = 0 num = 99 while num>0: sum = sum+num num = num-2 print(sum)
打印结果:
2500
break 和 continue
和其它语言的循环类似,Python 也提供了 break 和 continue 关键字用来控制循环:
d = ["zhangsan", "lisi", "wangwu"] for name in d: if name == "lisi": print(name) break # 找到对应的元素就退出循环
打印结果:
lisi
lisi
和 break 不同,continue 只是跳过当前循环:
d = ["zhangsan", "lisi", "wangwu"] for name in d: if name == "lisi": continue print(name)
打印结果:
zhangsan wangwu
利用循环开发一个猜数字游戏
游戏说明:随机生成一个 0-100 的数,参与者最多可以猜 5 次,看能否猜出随机数是多少。
参考代码:
import random num = random.randint(0,100) x = 0 n1 = 0 #记录猜的最近数 n2 = 100 #记录猜的最近数的距离 flag = False while x<5: x = x+1 n = int(input('随机输入一个数:')) if n == num: flag = True print('你真聪明,只用了%d次就猜对了,答案是%d'%(x, num)) break elif n>num: print('太大了!') if n-num<n2: n2 = n-num n1 = n else: print('太小了!') if num-n<n2: n2 = num-n n1 = n if not flag: print('都猜错了!答案是%d,你猜的数%d很接近了,下次努力!'%(num,n1))
打印结果:
随机输入一个数:5 太大了! 随机输入一个数:3 太大了! 随机输入一个数:2 你真聪明,只用了3次就猜对了,答案是2
- 小结
Python 为我们提供了非常完善的系统库,我们写程序时可以随取随用,让代码十分精简。比如,完成一个简单的定时任务,C 语言要写 1000 行代码,Go 需要 100 行,而 Python 可能只用 20 行就能实现。
所以 Python 是一种相当高级的语言。理论上来说,越高级的语言,我们入门的成本越低,上手也比较快。
这时,聪明的同学可能就开始问了:那既然 Python 这么好,为什么还需要其它语言呢?
是的,Python 也有它不会的地方,也有它的局限性。比如写操作系统,这个只能用低级语言写;写手机 App,只能用 Swift/Objective-C(iPhone)或 Java(Android);写终端控制器,最好用 C 或 C++。
而且 Python 的运行时间比 C/C++ 等语言都要慢,在性能敏感的程序上,Python 显然不是一个很好的选择。
代码汇总:
print(100+200) a = 1 # float(input("输入一个数字: ")) if a>0: print('a>0') else: print('a<=0') print('I\'m \"OK\"!') print('\\t\\') #转义时 print(r'\\\t\\') #不转义时 print('''line1 ...line2 ...line3''') print('''line1\n line2\n line3''') print('''line1 line2 line3''') print(r'''hello,\n ...world''') print(r'''hello,\n world''') print(True) print(False) print(3 > 1) print(3 > 5) print(True and False) print(True or False) print(not False) print(not 1 > 2) print(float("inf") > 20000) print(False==None) print(None==None) print(1==None) books = ['Chinese', 'Math', 'English'] print(books) l2 = ['Chinese', True, 123] print(l2) print(len(l2)) l2.append(123456) print(l2) books.insert(2, 12334) print(books) books.insert(10, 1233456) print(books) books.pop(4) print(books) classmate = ('zhangs', 'lis', 'wangw') print(classmate) d = {} # 存储名字和年龄的映射 d["zhangsan"] = 18 d["lisi"] = 19 print(d) d = {"zhangsan": 18, "lisi": 19} print(d) print(d.get("zhangsan")) print(d['zhangsan']) d.pop("zhangsan") print(d) d[1] = 20 print(d) s = set([1, 2, 3, 1, 2]) print(s) # {1,2,3 s.add(4) print(s) s.add(3) print(s) s.remove(3) print(s) age = 3 if age >= 18: print('adult') elif age >= 6: print('teenager') else: print('kid') names = ['b', 'a', 'c'] for name in names: print(name) sum = 0 for x in range(101): sum = sum+x print(sum) #5050 s1 = range(30) print(s1) print(len(s1)) sum = 0 num = 99 while num>0: sum = sum+num num = num-2 print(sum) d = ["zhangsan", "lisi", "wangwu"] for name in d: if name == "lisi": print(name) break # 找到对应的元素就退出循环 d = ["zhangsan", "lisi", "wangwu"] for name in d: if name == "lisi": continue print(name) import random num = random.randint(0,10) x = 0 n1 = 0 #记录猜的最近数 n2 = 100 #记录猜的最近数的距离 flag = False while x<5: x = x+1 n = int(input('随机输入一个数:')) if n == num: flag = True print('你真聪明,只用了%d次就猜对了,答案是%d'%(x, num)) break elif n>num: print('太大了!') if n-num<n2: n2 = n-num n1 = n else: print('太小了!') if num-n<n2: n2 = num-n n1 = n if not flag: print('都猜错了!答案是%d,你猜的数%d很接近了,下次努力!'%(num,n1))
打印结果:
apple@192 python % python3 test.py 300 a>0 I'm "OK"! \t\ \\\t\\ line1 ...line2 ...line3 line1 line2 line3 line1 line2 line3 hello,\n ...world hello,\n world True False True False False True True True True False True False ['Chinese', 'Math', 'English'] ['Chinese', True, 123] 3 ['Chinese', True, 123, 123456] ['Chinese', 'Math', 12334, 'English'] ['Chinese', 'Math', 12334, 'English', 1233456] ['Chinese', 'Math', 12334, 'English'] ('zhangs', 'lis', 'wangw') {'zhangsan': 18, 'lisi': 19} {'zhangsan': 18, 'lisi': 19} 18 18 {'lisi': 19} {'lisi': 19, 1: 20} {1, 2, 3} {1, 2, 3, 4} {1, 2, 3, 4} {1, 2, 4} kid b a c 5050 range(0, 30) 30 2500 lisi zhangsan wangwu 随机输入一个数:5 太大了! 随机输入一个数:3 太大了! 随机输入一个数:2 你真聪明,只用了3次就猜对了,答案是2 apple@192 python %