机器学习之python基础(三)
综述
这一系列博客是记录我在学习python和机器学习的过程中的一些实践过程和体会,学习python时用到的参考书籍是《python学习手册 第四版》,即《learning python》的中文版。学习机器学习时所用的主要参考书籍是《机器学习实战》,还参考了CSDN博客平台上博客名为zouxy09的部分博客文章(博客后面附有url链接),实现其中的各种算法所使用的程序语言是python,实验平台是Ubuntu14.04,所使用的python版本是2.7.6。如果有博友想要与我进行交流可以在博客后面留言,或者发邮件到我的邮箱zouchaobin@foxmail.com。
由于python3.0以后的版本与python3.0之前的版本有较大改变,所以为了某些代码的兼容性(如print函数),也为了便于直接使用《python学习手册》中的源代码(这本书的源代码是基于python3.x的),我决定采用以下处理方式:
from __future__ import print_function
from __future__ import division
在每个代码文件的开头加入以上两行代码,这样的话就可以使用python3.x的print函数和除法运算了,这样便于将这些代码稍加修改就能移植到python3.x的平台上。
python函数
函数是将一些语句集合在一起的部件,它们能够不止一次的在程序中运行,有的可以接受参数的传入,有的还包含返回值。
python中有许多的内置函数,用户可以直接调用,比如文件操作函数open(),write(),read()等,用户也可以根据需要自定义函数,但是需要遵守一定的规则。
def语句
python使用def来创建一个对象并将其赋值给某一变量名(函数名),从而生成函数,def在python中是一条可执行的语句,不像C语言,在运行def之前函数并不存在,运行def以后才产生函数。当然,也可以使用lambda来创建一个匿名的函数。
def <function_name>(arg1, arg2, arg3,...)......(函数体)
......
实例:return <value>
# -*- coding: utf-8 -*- from __future__ import print_function from __future__ import division #提出两个序列的交集部分 def intersect(seq1, seq2): res = [] for x in seq1: if x in seq2: res.append(x) return res s1 = 'spam' s2 = 'scam' print(intersect(s1,s2)) #就算是两个不同类型,不同长度的序列也可以实现同样的功能 #下面就是一个元组和一个列表相同元素的提取 print(intersect((1, 2, 3, 4), [4, 3, 6, 7, 8, 2]))
运行结果如下:
global语句
global语句用于声明变量的作用域,它并不是一个类型或者大小的说明,是一个命名空间的声明。总结如下:
1,全局变量是位于模块文件内部的顶层的变量名。
2,全局变量如果实在函数内被赋值的话,必须经过声明(否则会生成函数内部的同名局部变量)。
3,全局变量在函数的内部不经过声明也可以被引用,但是不能赋值。
以下实例用法说明来在函数定义时的global用法,更多关于作用域的说明请参考《python学习手册》第四版。
# -*- coding: utf-8 -*- from __future__ import print_function from __future__ import division x = 0 #operate1()中声明了x是全局变量,所以函数中修改x的值会 #修改全局变量x的值 def operate1(): global x x = 1 #operate2()中并没有声明x是全局变量, #所以operate2()中的x只是函数的局部变量,修改x并不影响全局变量x的值 def operate2(): x = 2 #对于operate3(),这是一个嵌套作用域的例子,函数operate3() #中又调用def语句生成了一个函数来打印x,在这种情况下, #函数func所引用的x来源于函数operate3()的作用域 def operate3(): global x x = 3 def func(): print(x) print('before operate:',x) operate1() print('after operate1:',x) operate2() print('after operate2:',x) operate3() print('after operate3:',x)
运行结果如下:
python提供了lambda语句来生成不带函数名字的匿名函数,lambda是一个表达式,而不是一个语句,lambda的主体是一个单个的表达式,而不是一个代码块:
运行结果如下:# -*- coding: utf-8 -*- from __future__ import print_function from __future__ import division def func(): x = 4 y = (lambda n:x ** n) return y a = func() print(a(2))
另外还有带参数的函数,本博客的第一个实例便是最简单的带参数的函数,另外函数还有许多高级话题,此处按下不表。