本笔记是完全与Java和C++语言进行对比,总结Python3与其不同的地方。这样达到一个快速学习与复习的效果。只需要记住不同之处,就可以熟练愉快的敲Python3代码了。
开发环境的搭建
- 下载有两种方式(建议第二种)
-
命令行使用Python
当你安装成功了,并且已经将Python安装目录中的python.exe所在目录配置好环境变量后,打开CMD,输入python,就可以在>>>符号后敲相应的代码,结果如下图:
图1.png -
安装Python的ide工具
这里推荐使用PyCharm,下载地址
下载好后安装,至于如何使用,请参考这个系列的博客(看不到我)
基础
Python的注释都是以#为开头,并且Python使用缩进来组织代码块,请务必遵守约定俗成的习惯,坚持使用4个空格的缩进。如下面代码
is_ture = False;
if is_ture:
print("哈哈哈,嘎嘎嘎,呱呱呱")
else:
print("天王盖地虎小鸡炖蘑菇")
输入与输出
- print()输出
print("你的名字是:")
print()函数也可以接受多个字符串,用逗号“,”隔开,就可以连成一串输出,记住每个“,”为一个空格分开,并且这个函数接收大部分类型为参数,如果字符串内部有很多换行,用\n写在一行里不好阅读,为了简化,Python允许用'''...'''的格式表示多行内容。
print("你的名字是:","吴彦祖")
那么如何输出格式化的字符串?在Python中,采用的格式化方式和C语言是一致的,用%实现,举例如下:
print("你好,%s"%"世界")
print("再见,%s go die %s 回来吧"%("小学生","哈哈哈"))
你好,世界
再见,小学生 go die 哈哈哈 回来吧
你可能猜到了,%运算符就是用来格式化字符串的。在字符串内部,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?,括号可以省略。如果你不太确定应该用什么,%s永远起作用,它会把任何数据类型转换为字符串。
有些时候,字符串里面的%是一个普通字符怎么办?这个时候就需要转义,用%%来表示一个%:
print('growth rate: %d %%' % 7)
growth rate: 7 %
另一种格式化字符串的方法是使用字符串的format()方法,它会用传入的参数依次替换字符串内的占位符{0}、{1}……,不过这种方式写起来比%要麻烦得多:
print('Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125))
Hello, 小明, 成绩提升了 17.1%
- input()输入
name = input()
print("你的名字是...fwfwg")
来看看下面这个特殊的例子:
age = input("your age is:")
# input()返回的数据类型是str,str不能直接和整数比较,必须先把str转换成整数。Python提供了int()函数来完成这件事情
# 当然有int函数,也有float函数,这就要看输入的是整型还是浮点型了
birth = int(age)
if birth>=18:
print("成年了")
else:
print("未成年")
这里有点就是数据类型的转换函数也是int()函数,将一个别的类型的值传入里面,就会转换为int类型。但是注意,转换规则还是和Java一样的。比如float转成int是会报错的。‘a’转成int也是会报错的。
数据类型与变量
- 布尔值
布尔值和布尔代数的表示完全一致,一个布尔值只有True、False两种值,要么是True,要么是False
- 运算符
在java中的 |,&,! 在Python中对应and、or和not运算
- 空值
空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值
- 变量
变量在程序中就是用一个变量名表示了,变量名必须是大小写英文、数字和_的组合,且不能用数字开头
a = 2
a = "123"
a = True
同一个变量可以反复赋值,而且可以是不同类型的变量,这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如Java是静态语言
- 常量
所谓常量就是不能变的变量,比如常用的数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量:
IP = 124568522
但事实上IP 仍然是一个变量,Python根本没有任何机制保证IP 不会被改变,所以,用全部大写的变量名表示常量只是一个习惯上的用法,如果你一定要改变变量IP 的值,也没人能拦住你。
- 除法的区别
在Python中,有两种除法
>>> 10 / 3
3.3333333333333335
/除法计算结果是浮点数,即使是两个整数恰好整除,结果也是浮点数
>>> 9 / 3
3.0
Python还提供一个余数运算,可以得到两个整数相除的余数
>>> 10 % 3
1
- 字符串
在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言,对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:
print("ord:",ord('B'))
print("chr:",chr(25991))
ord: 66
chr: 文
- bytes类型
Python对bytes类型的数据用带b前缀的单引号或双引号表示,要注意区分'ABC'和b'ABC',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。
x = b'ABC'
以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:
encode = 'ABCD'.encode('ascii')
encode = '中国'.encode('GB2312')
encode = '中国'.encode('ascii')
print(encode)
纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错,在bytes中,无法显示为ASCII字符的字节,用\x##显示。
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:
decode = b'ABCD'.decode('ascii')
print(decode)
ABCD
如果bytes中包含无法解码的字节,decode()方法会报错:
decode = b'\xe4\xb8\xad\xff'.decode('utf-8')
print(decode)
报错:
Traceback (most recent call last):
File "F:/Pythonproject/test_dir/__init__.py", line 1, in <module>
decode = b'\xe4\xb8\xad\xff'.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
如果bytes中只有一小部分无效的字节,可以传入errors='ignore'忽略错误的字节:
decode = b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
print(decode)
要计算str包含多少个字符,可以用len()函数:
print(len("wfowbogqwbvg"))
print(len(b'avegegg'))
print(len('中国'.encode('utf-8')))
12
7
6
可见,1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。
在操作字符串时,我们经常遇到str和bytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。
由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
list和tuple
- list
Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。说白了它其实就是可变长度的数组!同样可以用len()函数获取长度。记住这个的用法,就是和java的list集合与数组一样的用法。一样有添加,指定位置插入删除,取元素和数组取元素一样,并且比起java的list集合还牛逼的是她可以存储不同的数据类型,并且也可以嵌套list。下面代码演示以上所有功能:
test_list = ["哈哈哈" , 2 , 'A' , 5.2361 , [1 , "fegeg"]]
# 获取长度
print(len(test_list))
# 去第一个元素
print(test_list[0])
# 用-1做索引,直接获取最后一个元素,以此类推-2就是倒数第二个元素,注意不要角标越界
print(test_list[-1])
# 插入元素
test_list.append(2)
# 指定位置添加
test_list.insert(1,"我很帅")
# 删除末尾数据
test_list.pop()
# 删除指定位置数据
test_list.pop(2)
# 改变指定位置的元素
test_list[1] = 'C'
# 获取list中的list的指定位置元素
print(test_list[4][0])
- tuple
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,初始化tuple的是小括号,而list的是中括号。如下:
test_tuple = (1,2,4,6)
test_tuple这个tuple不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用test_tuple[0],test_tuple[-1],但不能赋值成另外的元素。
不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。所以,当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来。
来看看特列:
# 定义一个空的tuple
null_tuple = ()
# 定义一个只有一个元素的tuple,注意下面两个不是同一个意思。
# 前一个定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,
# 这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1。
# 所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义
tu1 = (1)
tu12 = (1,)
If语句
这个语句和Java与C的区别不大,就是写法不一样,注意不要少了:符号就行了。如下格式就可以了:
a = 20
if a>10:
print(a)
elif a<30:
print(30)
else:
print(0)
循环
Python的循环有两种,一种是for...in循环,一种是while,依次把list或tuple中的每个元素迭代出来。
- for...in
# range()函数,可以生成一个整数序列,再通过list()函数可以转换为list。比如range(100)生成的序列是从0开始小于100的整数
sum = 0
test_for = list(range(100))
for x in test_for:
sum = sum + x;
# 千万记住py的缩进原则,以下代码如果是和for 对其,那么只打印一次,就是最好的结果,如果是和sum = sum + x;对齐那么就会打印每次的循环
print(sum)
- while
sum = 0;
x = 99;
while x >0:
sum = sum + x
x -2
print(sum)
dict和set
- dict
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。具体用法和Java的map用法差不多,直接看示例吧:
test_dir = {'a':10,'a':2,'c':3,'d':4,'e':5}
# 按照key取元素
print(test_dir['a'])
# 赋值会覆盖前面的值
test_dir['b'] = 12
# 判断key存在的第一种方法,使用in
print('g' in test_dir)
# 第二种方式判断key,通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value
print(test_dir.get('a'))
print(test_dir.get('y',-1))
# 删除一个key
test_dir.pop('a')
你发现了,dir的key是可以重复的,并且后面的key的值会覆盖前面的重复的值。
- set
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。说白了,这个有点像java中的keyset()。
示例:
# 要创建一个set,需要提供一个list作为输入集合,注意:重复元素在set中自动被过滤
s = set([1,2,3,4,4,2,"sddf"])
# 添加元素到set
s.add(5)
# 删除元素
s.remove(4)
# set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
s1 = set([1, 2, 3])
s2 = set([2, 3, 4])
print(s1&s2)
set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错
注意看下面代码,和Java有所不同:
a = 'abc'
a.replace('a','A')
print(a)
输出结果是abc,而不是Abc。原因就是a本身是可不变的对象,第二行代码只是把 'abc'这个值做了变化,这个replace函数执行后生成了新的字符串,地址和a的地址不是同一个。
网友评论