本篇为AI未来系列第二篇,基础部分完结。为什么要研究学习python?python是未来屠龙的屠龙宝刀,再辅助以我们的高中数学基础(足够用的屠龙术),小白们即可把握人工智能的未来。本系列初步阶段主要攻克数据分析问题,中阶攻克爬虫问题,高阶进入人工智能阶段,顺带会穿插一些硬件知识。
想想这种偶然中的必然,心潮澎湃。Furture is coming,just do it。时不我待,今天是2019年2月13日农历初九,赶紧开始第二篇——幼儿园级,老妪也会,0基础学python一本通(下)。
正
文
六、函数
函数基本框架如下(【】中的内容表示是或选的,可以不写):
def 函数名(参数):
【'''函数说明文档'''】
函数主体
【return 返回对象】
函数小例子
#我们先定义一个函数
def find_max(series):
'''查找一个序列中最大值'''
the_max = series[0]
for j in series:
if j >= the_max:
the_max = j
return the_max
#调用函数
series = [1,20,23,1111,222,-10]
print('序列最大值:',find_max(series))
序列最大值: 1111
默认参数的使用
def pos_neg(x=1):
if x > 0:
print(x,'是正数')
else:
print(x,'不是正数')
pos_neg() #这里没有传入参数x,仍然可以运行,因为在未传入参数的情况下,默认x参数为1
1是正数
pos_neg(-10) #当然自己也是可以传入参数
-10不是正数
事实上,在调用很多python函数时,我们都使用了默认的参数设置
可变参数
def summation(*series): #注意这里参数前面的有一个* 表示的series这个参数是可变参数
'''求一个序列元素的加和'''
sum = 0
for i in series:
sum += i
return sum
summation(1,2,3,4,5,6,7) #可变参数的设置 使得我们可以传入任意个参数 函数调用时会自动组装为一个tuple
28
如果不设置为可变参数的话,需要传入一个序列形式的参数
def summation(series):
'''求一个序列元素的加和'''
sum = 0
for i in series:
sum += i
return sum
summation(1,2,3,4,5,6,7) #这样输入就会报错
报错
summation([1,2,3,4,5,6,7])
28
关键词参数
def info_insert(name, age, university, **other):
print('姓名:',name,'年龄:',age,'学校:',university,'其他信息:',other)
注意参数**other,这个参数允许我们传入任意个含参数名的参数,这些关键词参数在函数调用时会自动组装为一个dict
例如我们在做信息录入时,姓名,年龄,学校是必填信息,而其他信息是选填的,这时候就可以使用关键词参数
info_insert('娜塔莎 罗曼诺夫',99,'圣地亚哥大学')
姓名: 娜塔莎 罗曼诺夫 年龄: 99 学校: 圣地亚哥大学 其他信息: {}
info_insert('娜塔莎 罗曼诺夫',99,'圣地亚哥大学',性别='女',工作='特工')
姓名: 娜塔莎 罗曼诺夫 年龄: 99 学校: 圣地亚哥大学 其他信息: {'性别': '女', '工作': '特工'}
混合参数
在python函数定义中,可以用必选参数,默认参数,可变参数,关键词参数。注意这些参数的定义顺序为:必选参数,默认参数,可变参数和关键词参数
def info_insert(name, age, married='未婚',*schools, **kw):
2
print('姓名:',name,'年龄:',age,'婚姻状况:',married,'就读学校:',schools,'其他信息:',kw)
info_insert('娜塔莎 罗曼诺夫',99)
姓名: 娜塔莎 罗曼诺夫 年龄: 99 婚姻状况: 未婚 就读学校: () 其他信息: {}
info_insert('娜塔莎 罗曼诺夫',99,'已婚','浙江大学','上海财经大学')
姓名: 娜塔莎 罗曼诺夫 年龄: 99 婚姻状况: 已婚 就读学校: ('浙江大学', '上海财经大学') 其他信息: {}
info_insert('娜塔莎 罗曼诺夫',99,'已婚','浙江大学','上海财经大学',性别='女',工作='特工')
姓名: 娜塔莎 罗曼诺夫 年龄: 99 婚姻状况: 已婚 就读学校: ('浙江大学', '上海财经大学') 其他信息: {'性别': '女', '工作': '特工'}
递归函数
递归函数的含义是在函数定义过程中,会调用函数本身
def factorial(n):
'''计算n的阶乘'''
if n == 1:
return 1
else:
return n*factorial(n-1)
factorial(5)
120
匿名函数——lambda函数
lambda函数的基本格式为: lambda 参数: 表达式
匿名函数定义更为简便(控制在一行),有些简单的函数可以用它来写,或者作为复杂函数的组成部分
s = lambda x:print(x,'大于 1') if x>1 else print(x,'小于 1')
定义函数
s(10)
s(-10)
10 大于 1
-10 小于 1
七、模块
模块简单来说是一个保存了python代码的文件
很多python开源库就是模块
#例如我们调用科学计算库 numpy
import numpy as np #as np是为了之后方便调用
from pandas import DataFrame #只调用模块下的一个子模块
from numpy import * #导入模块中的所有子模块
print('调用numpy产生10个标准正态随机数\n',np.random.randn(10))
调用numpy产生10个标准正态随机数
[-0.86123492 -0.91268667 0.83897686 0.29236517 -1.30950825 -1.14943404
-0.36781918 0.13990052 0.4298387 -0.80505142]
#对于一个模块 我们可以先查看该模块下的所有子模块、变量和函数
import math
print('查看math模块下的所有子模块、变量和函数',dir(math))
查看math模块下的所有子模块、变量和函数 ['doc__', '_file_', '_loader_', '_name_', '_package_', '__spec', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
八、异常处理
在程序编写过程中,难免会有一些错误。python中有一些语句可以处理这些异常或者错误,使得程序能够运行,且识别到错误的位置
try..except函数
在下面的例子中,当j=0,10/0是会报错的,利用try..except语句之后还是可以将其他部分正常运行出来
x = 10
for j in [0,1,2,3]:
y = x/j
print(y)
x = 10
for j in [0,1,2,3]:
try:
y = x/j
print(y)
except :
print('除数不能为0')
除数不能为0
10.0
5.0
3.3333333333333335
x = 10
for j in [0,1,2,3]:
try:
y = x/j
print(y)
except ZeroDivisionError: #可以写出异常的类型
print('除数不能为0')
除数不能为0
10.0
5.0
3.3333333333333335
九、面向对象
面向对象是Python的特点。面向对象主要通过类class的定义来实现。类class是用来描述具有相同属性和方法的对象的集合。类定义了该集合中的每个对象的共有属性和方法
可以将类理解为一个模块,模块中包含很多个函数,每个函数用来实现某一个功能
对象是根据类创建的实例,通过实例化对象就可以执行类中的各个函数
面向对象不好理解。这里用一个小例子来说明面向对象的基本用法,关于面向对象在后面的系列中还会详述其更高层次的用法
例如,我们想创建一个简单的游戏程序,涉及到游戏人物的创建,几个游戏环节的设计等等
class charater:
'''创建游戏人物'''
def __init__(self, name, gender, age, ability):
self.name = name
self.gender = gender
self.age = age
self.ability = ability
def fight_grass(self):
self.ability = self.ability - 200
print('%s参加了一次野外战斗,消耗战斗力200' %self.name)
def self_trainng(self):
self.ability = self.ability + 100
print('%s参加了一次自我修炼,增长战斗力100' %self.name)
def mass_fight(self):
self.ability = self.ability - 500
print('%s参加了一次多人PK,消耗战斗力500' %self.name)
def show_info(self):
print('%s,%s岁,%s,%s战斗力' %(self.name,self.age,self.gender,self.ability))
#定义好上面的类之后 我们就可以开始游戏了 我们先创建3个游戏人物 rogers stark 和 natasha
rogers = charater('史蒂夫 罗杰斯','男',18,1000)
stark = charater('托尼 斯塔克','男',20,1800)
natasha = charater('娜塔莎 罗曼诺夫','女',19,2500)
# 先查看 三个游戏人物的 属性
rogers.show_info()
stark.show_info()
natasha.show_info()
史蒂夫 罗杰斯,18岁,男,1000战斗力
托尼 斯塔克,20岁,男,1800战斗力
娜塔莎 罗曼诺夫,19岁,女,2500战斗力
# 创建人物之后 每个人物可以进行不同的游戏环节 例如他们三个人 进行不同的游戏环节
rogers.mass_fight()
stark.self_trainng()
natasha.fight_grass()
史蒂夫 罗杰斯参加了一次多人PK,消耗战斗力500
托尼 斯塔克参加了一次自我修炼,增长战斗力100
娜塔莎 罗曼诺夫参加了一次野外战斗,消耗战斗力200
# 在经过了上面的环节之后 我们再来查看三个游戏人物的属性是否产生了变化
rogers.show_info()
stark.show_info()
natasha.show_info()
#可以发现 三个游戏人物在经历游戏环节之后 战斗力都发生了改变
史蒂夫 罗杰斯,18岁,男,500战斗力
托尼 斯塔克,20岁,男,1900战斗力
娜塔莎 罗曼诺夫,19岁,女,2300战斗力
十、文件读写
在进行数据分析之前,可能需要读写自己的数据文件。或者在完成数据分析之后,想把结果输出到外部的文件
在Python中,利用pandas模块中的几个函数,可以轻松实现这些功能,利用pandas读取文件之后数据的格式为数据框,且如果想用pandas将数据输出为外部文件,也要先确保要输出的文件的格式为数据框
注意因为这里演示了文件的操作,需要将文件上传到网站的数据文件目录下才可以成功运行程序
import pandas as pd
#首先导入pandas库 as pd是将这个库缩写 之后调用这个库 只需要写pd就可以了 而不用写全称pandas
10.1 读取txt文件
text = pd.read_table('data/test2.txt',index_col=0,delimiter=' ')
# 文件所在的路径是必须输入的
# index_col=0指定第一列为index
# delimiter指定了数据间的分隔符,分隔符可以使空格,制表符,;等等
# 这个函数中还有很多参数可以定义
text
10.2 读取excel/csv文件
data_excel = pd.read_excel('data/test3.xlsx')
2
# 文件所在的路径是必须输入的
3
data_excel.head()
data_csv = pd.read_csv('data/test3_csv.csv',encoding='GBK')
2
# 文件所在的路径是必须输入的
3
#这里要注意,encoding='GBK'一般是要加上,涉及到编译解码的问题
4
data_csv.head()
10.3 输出为excel/csv文件
注意因为这里演示了文件的操作,需要将文件上传到网站的数据文件目录下才可以成功运行程序
#DataFrame生成 这里生成了一个数据框 各位可以先不考虑这个细节,在之后的pandas库中详细说明了数据框的所有操作 这里只是为了说明文件的输出
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = pd.DataFrame(data)
frame.head()
# 将数据集frame输出为外部文件
frame.to_excel('data/写出为excel.xlsx')
frame.to_csv('data/写出为csv.csv')
来源:我的印象笔记整理
ABO
Me
JiangShi【ID:siteacher】
AI CREATE FURTURE
VALUE LAST LONG