最近写了个简单的python爬取新浪NBA球员数据的小脚本。虽然编写函数,创建类和对象什么的都没什么问题,但是却不能正确了解其中的正确关系。self代表什么?为什么有的函数名字之前会加上__双下划线?是时候重新了解一下什么是真正的面向对象的技术了!
为什么存在?
所谓存在即有理,函数是程序员们为了偷懒而设计,目的是讲具有相同的操作或者能够达到相同的目的的操作同一起来,抽象之为函数。
函数的创建!
普通创建:def methodA(): 函数名一般规范为第一个单词小写,其余单词首字母大写,如getName()
装饰器创建。
函数的参数:
形参:只是传递作用,存在必选参数,默认参数,魔法参数,组合参数
实参:传递进去的实际有值得参数
魔法参数:注意输出时没有*号,一个*是尽可能的收集其余参数返回元组,**是尽可能的收集其余参数返回一个字典。例如requests模块的requests(url,**kwargs)
def getName(name,*n,**m): a = name print(a,n,m) getName('zhao',1,2,3,key1='value1',key2='value2') #zhao (1, 2, 3) {'key1': 'value1', 'key2': 'value2'} 函数的返回值:所有函数都有返回值,可能是你reduce的或者None
函数中变量的作用域:
一个变量在函数中,只在该函数起作用,称为全局变量。在全类中起作用,被称作全局变量。
相互调用: 声明一个全局变量global x 则x为全局变量。调用局部变量 nonlocal不常用。
递归:函数调用自身。常见在幂运算和迭代中,以后详细介绍。实例:二分法(bisect模块实现)
函数式编程:几个函数
map(函数,列表),作用是将列表中每个元素的值传入函数中,并返回一个列表
a = map(str,range(10)) print(list(a)) #['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']filter(函数,列表),将列表中没给元素依次传入函数中。这个函数必须是基于布尔类型返回值的,通过这个函数进行对元素的过滤。isalnum()判断字符串是否全有字母数字组成
b = ['dsasd','123','ass2','##@'] def func(x): return x.isalnum() f = filter(func,b) print(list(f)) #['dsasd', '123', 'ass2'] reduce(函数,列表) 作用是将列表中前两个元素传入到函数中,并将返回值继续与第三个参数传入函数中。
from functools import reduce def add(x,y): return x+y c = reduce(add,range(10)) print(c) #45 由这几个函数的扩展:
列表推导式: x for x in b if x.isalnum() 与filter(func,b)相同
str(i) for i in range(10) 与 map(str,range(10))相同
求和:In [12]: sum(range(10)) Out[12]: 45 以上全部为简单零碎只是,算是《python基础教程》的读书笔记,毕竟理解了才算是自己的
在后来更加抽象时再增添函数的特性。如函数名.__doc__返回的是函数的注释
