Python 有三个非常重要的特性,易上手,社区丰富,性能扩展方便。科学家们很早就喜欢用Python实验算法,也善于使用numpy做科学计算,用pyplot画数据图。但实际上人工智能的核心算法是完全依赖于C/C++的,因为是计算密集型,需要非常精细的优化,还需要GPU、专用硬件之类的接口,这些都只有C/C++能做到,某种意义上其实C/C++才是人工智能领域最重要的语言。Python是这些库的API binding,使用Python是因为CPython的胶水语言特性,要开发一个其他语言到C/C++的跨语言接口,Python是最容易的。各种原因,Python与人工智能成了CP。废话不多说, 开始学习python。
本文知识点:
1 | Python的数据类型 | 字符串、整数与浮点数、布尔值、日期时间,查看变量类型,类型转换 |
2 | Python数据结构 | 列表、元组、集合、字典、互相转换 |
3 | Python控制流 | 顺序、分支、循环、列表生成式 |
4 | Python函数 | 调用函数、定义函数、高阶函数 |
1. Python的数据类型
1.1 字符串
在Python中用引号引起来的字符集称之为字符串,比如:'hello'、"my Python"、"2+3"等都是字符串 Python中字符串中使用的引号可以是单引号、双引号跟三引号。
print('单引号:', 'Hello world!') # 单引号print("双引号:", "Hello world!") # 双引号print('单双:', 'Hello "World"!') # 单引号, 内部双引号就只是普通字符print('双单:', "Hello 'World'!") # 双引号, 内部单引号就只是普通字符print( '三引号:',"""Hello world!""") # 三引号
- 转义字符
转义字符\可以转义很多字符,比如\n表示换行,\t表示制表符,字符\本身也要转义,所以\表示的字符就是\
print ('It\'s a good tool!') # '的转义 \'print ("hello world!\nhello Python!") # 回车print ('\\\t\\') # 斜杠本身 和 Tabprint (r'\\\t\\') # 原样输出引号内的字符串引号前加r
- 子字符串及运算
取子字符串有两种方法,使用[]索引或者切片运算法[:],这两个方法使用面非常广
s = 'Python'print( 'Py' in s) # in 的用法print( 'py' in s) #注意大小写print (s[2]) #取字符串的方法,索引法print (s[1:4]) #取字符串的方法,切片法######字符串的连接, 与格式化输出########word1 = '"hello"'word2 = '"world"'sentence = word1.strip('"') + ' ' + word2.strip('"') + '!'print( 'The first word is %s, and the second word is %s' %(word1, word2))print (sentence)
1.2 整数与浮点数
Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样
7 + 3 #加7 - 3 #减7 * 3 #乘7 / 3 #除7 ** 2 #乘方7 % 2 #取余7 // 2 #取整
其他几种运算, 另负责运算需要调用math
1.3 布尔值
print('True and False:',True and False) #And 运算print('True or False:',True or False) #Or 运算print('True + False',True + False) #加法print("18 >= 6 * 3 or 'py' in 'Python'", 18 >= 6 * 3 or 'py' in 'Python')
1.4 日期时间
import timenow = time.strptime('2020-06-01', '%Y-%m-%d')print ('now:', now)print('strftime',time.strftime('%Y-%m-%d', now)) #根据指定的格式把一个时间字符串解析为时间元组import datetimesomeDay = datetime.date(2020,5,30)anotherDay = datetime.date(2020,6,1)deltaDay = anotherDay - someDay #时间的加减法print('deltaDay:',deltaDay.days)
1.5 查看变量类型
print(type(None)) #None Typeprint(type(1.0)) #Floatprint(type(1)) #Intprint(type(False)) #Booleanprint(type('1')) #String
1.5 类型转换
print(str(10086)) # 转字符串print(float(10086)) # 转浮点数print(int('10086')) #字符 -> 整数print(complex(10086)) #创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。
2 Python数据结构 (这个很重要*)
列表(list)、元组(tuple)、集合(set)、字典(dict)
2.1 列表(list)
用来存储一连串元素的容器,列表用[]来表示,其中元素的类型可不相同。仔细用代码实验。
mylist= [1, 2, 3, 4, 5 ,6] #例子是从1开始, 而计数的索引从0开始print (mylist)# 索引从0开始,含左不含右print('[0]=',mylist[0]) # 索引从0开始, 第0个数是1print ('[5]=', mylist[5]) # 从左边数第五个数 是6,注意是索引从0开始的*print ('[-6]=', mylist[-6]) # 从右边数第6个数 是1print ('[0:4]=', mylist[0:4]) # 从第一个数取到第四个, 含左不含右,索引从0开始print ('[:4]=', mylist[:4]) # 默认左侧头开始print( '[4:]=', mylist[4:]) # 默认从4取到结尾, 含左不含右,第4个数是5print ('[0:4:2]=', mylist[0:4:2]) # [start:end:step], 从第1个取到第4个,每步跳2个数print ('[::2]=', mylist[::2]) # [start:end:step], 从第开头取到第结尾,每步跳2个数print ('[-5:-1:]=', mylist[-5:-1:]) # 从右边取, 默认跳步为1print ('[-2::-1]=', mylist[-2::-1]) # 从右边第二个开始取, 取到最左边
List的操作:增删改,查找,统计
mylist[3] = "小月" # 修改, 把索引为3的, 修改为小月print (mylist[3])mylist[5]="小楠" # 修改, 把索引为5的, 修改为小楠print (mylist[5])print ('修改数据', mylist) # 索引是从0开始mylist.append('han') # 添加数据到尾部mylist.extend(['long', 'wan']) # 添加数据print ('添加数据:', mylist)v1 = 'Inert_5'scores = [90, 80, 75, 66]mylist.insert(5,v1) #添加到第5个位置mylist.insert(1, scores) #添加到第1个位置print(mylist)print( 'wan' in mylist) #判断wan是否在列表中print ('han' not in mylist) #判断han是否不在列表中print(mylist.count('wan')) # count函数, 计算个数print(mylist.index('wan')) # index函数, 返回索引位置print(mylist.pop(mylist.index('wan'))) #移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。print(mylist)
2.2 元组(tuple)
元组类似列表,元组里面的元素也是进行索引计算。列表里面的元素的值可以修改,而元组里面的元素的值不能修改,只能读取。元组的符号是()。
scores = [90, 80, 75, 66]studentsTuple = ("ming", "jun", "qiang","ming", "wu", scores)print('Tuple:',studentsTuple)try: studentsTuple[1] = 'fu' #元组的值不能修改except TypeError: print ('TypeError') scores[1]= 100 #socres为列表, 列表的值可以改print(studentsTuple)print("In or not:", 'ming' in studentsTuple) #判断是否在元组中print('取数:', studentsTuple[0:3]) #索引从0开始, 含左不含右print("Count:", studentsTuple.count('ming')) #返回某个值的个数print("Index", studentsTuple.index('jun')) #返回索引位置print("Len:", len(studentsTuple)) #元组个数
2.3 集合(set)
Python中集合主要有两个功能,一个功能是进行集合操作,另一个功能是消除重复元素。集合的格式是:set(),其中()内可以是列表、字典或字符串,因为字符串是以列表的形式存储的。集合的基本运算函数如下:
# 集合的运算, 增 add(), 删remove() , 改 update() , 交集、并集、差集studentsSet = set(mylist)print ('原:',studentsSet)studentsSet.add('xu') #增: 增加值print ('增:',studentsSet)studentsSet.remove('xu') #删: 删值print ('删:',studentsSet)a = set("abcnmaaaaggsng") #去除重复的值print ('a=', a)b = set("cdfm")print ('b=', b)x = a & b #交集print( 'x=', x)y = a | b #并集print ('y=', y)z = a - b #差集print( 'z=', z)new = set(a) #会自动去除重复元素print( z)
2.4 字典(dict)
Python中的字典dict也叫做关联数组,用大括号{}括起来,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度,其中key不能重复。
#字典dict, 定义, 显示, 增、删、改、查k = {"name":"weiwei", "home":"guilin"}print (k["home"]) #返回固定key的,valueprint( k.keys()) #显示所有的keysprint( k.values()) #显示所有的值k["like"] = "music" #增:增加字典里的键值对k['name'] = 'guangzhou' #改:修改字典里键对应的值print (k)k.pop('like') #删:删除对应的键值对print (k)print(k.get('edu', -1)) #查:通过dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value
3 Python控制流
在Python中通常的情况下程序的执行是从上往下执行的,而某些时候我们为了改变程序的执行顺序,使用控制流语句控制程序执行方式。Python中有三种控制流类型:顺序结构、分支结构、循环结构。
另外,Python可以使用分号";"分隔语句,但一般是使用换行来分隔;语句块不用大括号"{}",而使用缩进(可以使用四个空格)来表示。
3.1 顺序结构
s = '7'num = int(s) # 一般不使用这种分隔方式num -= 1 # num = num - 1 num *= 6 # num = num * 6print (num)
3.2 分支结构:Python中if语句是用来判断选择执行哪个语句块的
if <True or Flase表达式>: 执行语句块elif <True or Flase表达式>: 执行语句块else:# 都不满足 执行语句块 # elif子句可以有多条,elif和else部分可省略
salary = 1000if salary > 10000: print ("Wow!!!!!!!")elif salary > 5000: print ("That's OK.")elif salary > 3000: print ("5555555555")else: print ("..........加油?")
3.3 循环结构
#while 循环while <True or Flase表达式>: 循环执行语句块else:# 不满足条件 执行语句块#else部分可以省略
# for循环for (条件变量) in (集合): 执行语句块 # “集合”并不单指set,而是“形似”集合的列表、元组、字典、数组都可以进行循环# 条件变量可以有多个heights = {'Yao':226, 'Sharq':216, 'AI':183}for i in heights: print (i, heights[i])print('_'*20) for key, value in heights.items(): print(key, value) print('_'*20) total = 0for i in range(1, 101): total += i#total=total+iprint ('total:', total)
3.4 break、continue和pass
break:跳出循环continue:跳出当前循环,继续下一次循环pass:占位符,什么也不做for i in range(1, 5): if i == 3: break #跳出循环 print (i)print('_'*20) for i in range(1, 5): if i == 3: continue #跳出当前循环,继续下一次 print (i) print('_'*20) for i in range(1, 5): if i == 3: pass #占位, 什么也不做 print (i)
3.5 列表生成式
三种形式
- [ for (条件变量) in (集合)]
- [ for (条件变量) in (集合) if ]
- [ if else for (条件变量) in (集合) ]
fruits = ['"Apple', 'Watermelon', '"Banana"']print('list1: ',[x.strip('"') for x in fruits]) #1个for,字符# 另一种写法test_list=[]for x in fruits: x=x.strip('"') test_list.append(x)print('list1: ',test_list)print('_'*40) print('list2: ',[x ** 2 for x in range(21) if x%2]) #1个for,数字# 另一种写法test_list=[]for x in range(21): if x%2: x=x**2 test_list.append(x)print('list2: ',test_list)print('_'*40) print('list3: ',[m + n for m in 'ABC' for n in 'XYZ']) #2个for 字符# 另一种写法test_list=[]for m in 'ABC': for n in 'XYZ': x=m+n test_list.append(x)print('list3: ',test_list)print('_'*40) d = {'x': 'A', 'y': 'B', 'z': 'C' }print('list4: ',[k + '=' + v for k, v in d.items()]) #键值展示格式# 另一种写法test_list=[]for k, v in d.items(): x=k + '=' + v test_list.append(x) print('list4: ',test_list)
4 Python函数
函数是用来封装特定功能的实体,可对不同类型和结构的数据进行操作,达到预定目标。
4.1 调用函数
Python内置了很多有用的函数,我们可以直接调用,进行数据分析时多数情况下是通过调用定义好的函数来操作数据的。
str1 = "as"int1 = -9print (len(str1))print (abs(int1))fruits = ['Apple', 'Banana', 'Melon']fruits.append('Grape')print (fruits)
4.2 定义函数
当系统自带函数不足以完成指定的功能时,需要用户自定义函数来完成。
def 函数名(): 函数内容 函数内容 <return 返回值> def my_abs(x): if x >= 0: return x else: return -x my_abs(-9)# 可以没有returndef filter_fruit(someList, d): for i in someList: if i == d: someList.remove(i) else: passprint (filter_fruit(fruits, 'Melon'))print (fruits)#返回多个值的情况def test(i, j): k = i * j return i, j, ka , b , c = test(4, 5)print (a, b , c)type(test(4, 5))
4.3 高阶函数
把另一个函数作为参数传入一个函数,这样的函数称为高阶函数。
函数本身也可以赋值给变量,函数与其它对象具有同等地位。
myFunction = absmyFunction(-9)#参数传入函数def add(x, y, f): return f(x) + f(y)add(7, -5, myFunction)#*重要 :map/reduce: map将传入的函数依次作用到序列的每个元素,#并把结果作为新的list返回;reduce把一个函数作用在一个序列[x1, x2, x3...]上,#这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算myList = [-1, 2, -3, 4, -5, 6, 7]map(abs, myList)from functools import reducedef powerAdd(a, b): return pow(a, 2) + pow(b, 2)reduce(powerAdd, myList) # 是否是计算平方和?#filter: filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素def is_odd(x): return x % 3 # 0被判断为False,其它被判断为Truefilter(is_odd, myList)#sorted: 实现对序列排序,默认情况下对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1#默认排序:数字大小或字母序(针对字符串)sorted(myList)#返回函数: 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回def powAdd(x, y): def power(n): return pow(x, n) + pow(y, n) return powermyF = powAdd(3, 4)myFmyF(2)#匿名函数:高阶函数传入函数时,不需要显式地定义函数,直接传入匿名函数更方便f = lambda x: x * xf(4)#等同于def f(x): return x * xmap(lambda x: x * x, myList)#匿名函数可以传入多个参数reduce(lambda x, y: x + y, map(lambda x: x * x, myList))#返回函数可以是匿名函数def powAdd1(x, y): return lambda n: pow(x, n) + pow(y, n)lamb = powAdd1(3, 4)lamb(2)
其他:
- 标识符第一个字符只能是字母或下划线,第一个字符不能出现数字或其他字符;标识符除第一个字符外,其他部分可以是字母或者下划线或者数字,标识符大小写敏感,比如name跟Name是不同的标识符。
- Python规范:
- 类标识符每个字符第一个字母大写;
- 对象\变量标识符的第一个字母小写,其余首字母大写,或使用下划线'_' 连接;
- 函数命名同普通对象。
关注我, 一步步从基础学