我是从 android 入门的,一直以来学习的也是客户端的技术,语法是专研 java,kotlin,Dart,难免感觉自己技术浅薄,偏科,万一哪天要是淘汰了呢,虽说这是杞人忧天,但是这就是我内心对的忧虑,看着 AI 发展的红红火火,自治是时候开始接触 AI,开始自己的 AI 应用之旅了,那么就从 Pthon 语法基础开始吧~
Python 环境
目前 Python 有 2.7X 和 3.7X 2个版本,2.7 和 3.7 语法上有些差别,2.7 的代码不能直接在 3.7 上运行,目前 Python 库也有一些不能在 3.7 上运行,我这里直接以 3.7 版语法为基准,2.7 和 3.7 差别不是很大,大家有兴趣看看就行了,2.7 版代码唉格式和书写上相互对宽松,3.7 版则标准化了整个书写格式和规范
- python2与python3的区别齐全【整理】
- Python2和Python3的区别,以及为什么选Python3的原因
IED 工具使用的是 pycharm,看着和 AS 很像,所以就用它了,和 AS 一样的是耗费内存,当然还有很多其他 IED 开发工具
Python 特性
Python 的特性非常鲜明:
- 解释型语言 - python 文件不需要编译,可以由解释器直接运行,当然这样的话速度上 Python 就不见长了
- 支持多种系统平台 - Python 因为不用编译,并且很多平台都兼容 Python,所以一处编写的 Python 文件可以处处运行
- 语法及其简洁 - 用最少的代码,干最多的事,我想这是 Python 的初衷了吧,没有语言能如同 Python 一样致力于减少代码量了,这点我在开始学习时就有感触了
-
胶水
粘合其他语言 - Python 据说可以很容易就链接替他语言变写的库,这点还没看到,所以 Python 的学习也是很简单,用别人的库就行了 - 支持高阶函数 -
- 弱类型语言 - 甚至不需要写 var,val
- 没有{} - python 方法提没有 {} 包裹,完全靠缩进表示,非常蛋疼,缩进不对是会出错的,只能考 IED
python 历史原理是一上来只支持 ASCII编码,在 IED 中设置 UTF-8 到时没问题,但是在命令行执行时就不行了,需要加上一个 tag:# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
....代码....
Python 数据类型
Python 致力于极简,所以数据类型也简化了,只有:
- int - 整数
- float - 浮点数
- boolean - 布尔值,python 的 boolean 值都是大写的:
True、False
- string - 字符串
- None - python 的空值
没有传统的 java 中 byte,short,long,double
这些基本数据类型了
python 的写法很自由,前面说了 python 是弱类型语言,python 不仅是弱类型,甚至连都不用加变量表示,不用写 var、val
可以给参数连续赋值不同类型的数据
# -*- coding: utf-8 -*-
# 连续赋值不同类型数据
a = 10
a = "xxx"
a = True
print(str(a))
-> /Users/zbzbgo/workspace_python/Test/Test.py
True
python 注释
#
这个字符就是注释标记了
# xxx
# yyy
python 基本方法
- str() - 转换成字符串
- int() - 转换成整数
- float() - 转换成浮点数
- print() - 打印
- input - 接受命令行输入参数
python 的这些基本方法,大家看看解释就知道怎么用了,我就说说需要注意的点:
- print 函数可以接受表达式或是字符串,不能又传字符串又传其他类型的数据
字符串
# -*- coding: utf-8 -*-
# r"..." 表示不转义
a = r'\(~_~)/ \(~_~)/'
# '''...''' 多行数据,根据输入格式输出
b = '''
AAA
BBB
CCC
'''
# r'''...''' 也行的
c = r'''Python is created by "Guido".
It is free and easy to learn.
Let's start learn Python in imooc!'''
print(a)
print(b)
print(c)
-> /Users/zbzbgo/workspace_python/Test/Test.py
\(~_~)/ \(~_~)/
AAA
BBB
CCC
Python is created by "Guido".
It is free and easy to learn.
Let's start learn Python in imooc!
python 的字符串也支持切片
这样截取字符串挺方便的
>>> 'ABCDEFG'[:3]
'ABC'
>>> 'ABCDEFG'[-3:]
'EFG'
>>> 'ABCDEFG'[::2]
'ACEG'
运算符
python 运算符没有 ===,&&,||
,多了 **,//,and,or
这几个:
- ** - 平方,2**3 = 2的3次方= 8
- // - 整除,10//3 = 3
- and -
&
与逻辑运算符 - or -
|
或逻辑运算符
and,or
大家要是用不习惯,&,|
在 python 里面还是能使的
控制语句
python 的控制语句有if,while,break,continue,for
1. if
# if 语句
if age > 100:
print(age)
elif age > 80:
print(age)
else:
print(age)
注意:
- if 写不写
()
都没事 - 使用
:+缩进
代替{}
包裹方法,真的不是很方便查看,好在 python 自身讲究简洁,代码不多看着还可以 -
else if
在 python 中是elif
2. for
names = [ 0,2,3,4,56,7,8,9,"AA","BB","CC"]
for name in names:
print(name)
写着和 kotlin 很像啊
3. while
N = 10
x = 0
while x < N:
print (x)
x = x + 1
4. break
sum = 0
x = 1
while True:
sum = sum + x
x = x + 1
if x > 100:
break
print (sum)
5. continue
for x in L:
if x < 60:
continue
sum = sum + x
n = n + 1
集合
集合的概念在 python 中并没有变化,但是在 python 中对应的关键字改了,另外 python 还加入了不可变集合:
- list - list 没变,可变,有序,可重复
- tuple - 不可变的 list,不可变的是元素值不能改,但是允许添加删除元素
- dict - map 集合,无序的,key 不可重复
- set - 无序的,不可重复的,不可变的 list ,和 tuple 很像
1. list
# -*- coding: utf-8 -*-
# 声明 list 集合
names = []
names = [1,2,3,4]
names = [1,"AA",5,"BB","CC"]
# 通过索引获取数据
name = names[0]
# 加-号倒序获取数据,-1最后一个,-2倒数第二个
name = names[-1]
name = names[-2]
# append 在末尾添加数据,insert 在指定位置添加数据
names.append("DD")
names.insert(1,"DD")
# pop 删除数据时会返回该数据
name = names.pop(1)
# 替换数据直接上 index 就行s
names[0] = "AKA"
# 打印 list 集合
print(names)
# let 返回集合元素数量
len(names)
# in 判断 list 内有没有这个值
if 1 in names:
print( "AA" )
- 使用
[]
声明 list,没有内容就是空集合 - 集合中可以传入不同数据类型的数据
- print 方法可以打印集合
- 通过
list[index]
获取数据使用上很想数组
整体上感觉就是 java 的组数,整理下 list 专属方法:
- append - 在 list 末尾添加数据
- insert - 在指定位置添加数据
- pop - 删除数据,但是会返回该数据
- let - 返回集合元素数量
- in - 判断 list 内有没有这个值
集合的遍历总是又说头的,看这里,Python 也是有花样的
# 遍历思路 1:for
for name in names:
print(name)
# 遍历思路 2:enumerate(list)
names = [0, 2, 3, "AA", "BB", "CC"]
for index, values in enumerate(names):
print("index=" + str(index) + ",value=" + str(values))
# 遍历思路 3:高阶函数 - map
def funtion1(x):
return x + 2
names = [0, 5, 4, 7, 8, 6, 2, 4, 5]
names = map(funtion1, names)
print(names)
切片 这是 python 自己的说的没,就是截取一部分
names2 = [0, 2, 3, "AA", "BB", "CC"]
names2 = names2[0:3]
print(names2)
注意:0 是从哪个 index 开始,3 是取几个数
蛋疼的是切片
也支持 -数,大家看看下面的总结吧:
>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']
>>> L[-2:]
['Bart', 'Paul']
>>> L[:-2]
['Adam', 'Lisa']
>>> L[-3:-1]
['Lisa', 'Bart']
>>> L[-4:-1:2]
['Adam', 'Bart']
2. tuple
names = (1,2,3,)
print(names)
tuple 我是觉得没啥用,也就是能节约些内存,使用()
来声明 tuple,这个()
会和方法的()
冲突,所以最有一个元素后也要写,
挺蛋疼的
3. dict
dict python 版的 map 集合,这个大家唉都熟悉,我觉得 python 为啥要给 map 集合改名字,其他语言基本没有动 map 的
# 声明 dict 集合
names = {
"name1": "AA",
"name2": "BB",
"name3": "CC",
"name4": "DD",
"name5": "EE",
57: 88
}
# print 可以直接打印
print(names)
# len 获取 dict 元素数量
print(len(names))
# dict[key] 就可以获取 value 值
print( names["name1"] )
# get 也可以获取 value 值
print( names.get("name2"))
# 判断 dict 内有没有这个值
if "AA" in names:
print( "AA" )
# dict 赋值直接写就行,key 没有的话相当于添加元素了,key 有的话会更新 value 值
names["AKS"] = 998
names["name1"] = 998
- dict 内 key 和 value 可以是任何数据类型的,这样的开放结构有好处也有坏处,写起来方便,用起来麻烦
- 虽然 dict[key] 也起来方便,但是活获取不到值的话会崩,get 方法就不会,没有的话就是 None
- len - dict 元素数量
- in - 判断 dict 内有没有这个值
集合的遍历总是又说头的,看这里,Python 也是有花样的
names = { 'Adam': 95, 'Lisa': 85, 'Bart': 59, 'Paul': 74 }
# 遍历思路 1: for
for key in names:
print(names[key])
# 遍历思路 2: values()
names = names.values()
for name in names:
print(name)
# 遍历思路 3: items()
for key, value in names.items():
print("key=" + key + ",value=" + str(value))
4. set
names = set([0,1,2,3,4,5,6,7,8,9])
# 添加元素
names.add(78)
# 删除元素
names.remove(0)
set 本质上还是 list,所以 set 的构建需要传一个 list 进来,蛋疼的是添加删除元素的方法名字居然和 list 不一样,何必呢,有啥必要,我是看不到,只能说这不是同一个员工写的,每个人都有不同的思路和习惯啊,引申一下,公司内要是不做好代码规范,思路统一,那代码还能看吗,改别人的代码头疼死
set 方法:
- add - 添加元素
- remove - 删除元素
函数
基本使用:python 用def
指代一个函数,参数不用指定类型,并且可以返回多个值,返回多个值时结果本质上一个 tuple 集合
def add(name1,name2):
return name1,name2
result = add(1, "AA")
print(result)
print( result[0] )
print( result[1] )
➜ Test python Test.py
(1, 'AA')
1
AA
高阶函数: python 支持高阶函数,高阶函数的本质就是闭包,函数对象化,可以把函数当做一个对象一样作为参数参入,使用
def add(name1,name2):
return name1,name2
def remove(index1,index2,funtion1):
return funtion1(index1,index2)
print(remove(0,2,add))
➜ Test python Test.py
(0, 2)
参数默认值 python 允许方法参数有默认值,具体使用时可以xie,也可以不写
def update(name, age=10, index=10):
print(name + " / " + str(age))
update("AA")
update("AA", 18)
update("AA", age=22, index=16)
可变参数 python 的可变参数必须这样写*args
,不能改的,方法的参数中只能有一个可变参数
def speak(name, *args):
print(name + ":")
for index in args:
print("age = " + str(index))
speak("AA", 1, 2, 3, 5, 4, 5, 78)
➜ Test python Test.py
(0, 2)
AA:
age = 1
age = 2
age = 3
age = 5
age = 4
age = 5
age = 78
快速生成集合
从这开始就是属于 python 自己的特长了,其他语言我是没看到过如 python 这般简洁
range range(start,end) 函数可以快速生成从 start - end-1 的集合数据
print(range(0, 10))
➜ Test python Test.py
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
python 的 lambda 表达式 1 [ 表达式 for item名字 in range(start,end) ]
def add(name):
print(name)
names = [add(name) for name in range(0, 10)]
➜ Test python Test.py
0
1
2
3
4
5
6
7
8
9
python 的 lambda 表达式真的简单,直接在[]
这个list构建中就写了,注意这里最好封装成一个方法,要不很多时候会报错,我只想说一句真是省代码
python 的 lambda 表达式 2 这次是使用 dict 来快速生成 list
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
tds = ['%s %s ' % (name, score) for name, score in d.items()]
print("")
print( 'Name Score ')
print( '\n'.join(tds))
print( '
')
➜ Test python Test.py
Name Score
Lisa 85
Adam 95
Bart 59
大家看,模拟一个 html 的表格
出来
lambda 加上条件判断语句 lambda 表达式在最后还可以加上 if
作为条件判断语句,注意处理的数据是原始数据,不是经过前面 lambda 处理过后的数据
def add(name):
return name * 2
names = [ add(name) for name in range(0,20) if name > 15]
print(names)
➜ Test python Test.py
[32, 34, 36, 38]
多层 lambda 表达式 for
循环可以嵌套多个
def add(word, number):
return str(word) + str(number)
names = [add(word, number) for word in "ABC" for number in range(1, 4)]
print(names)
➜ Test python Test.py
['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
上面这段代码相当于:
L = []
for m in 'ABC':
for n in '123':
L.append(m + n)
再体会下,python 的极简注意的确是有只得说道的 ~