用模块管理函数

对于任何一个编程语言来说,给变量和函数起名都很麻烦,因为会遇到命名冲突问题,最简单的场景就是在同一个.py 文件中,定义了两个同名函数,由于Python没有重载的概念,也就是说之前定义的会被覆盖,实际上只有一个函数存在的。

def foo():
	print "hello world"

def foo():
	print "hai"

#下面的代码会输出什么呢?
foo()

当然上面的情况很容易避免的,但是如果是团队协作开发时候,很多人都使用了foo的函数,怎么解决命名冲突呢?
其实很简单,Python中每个文件代表一个模块(model),在不同的模块中可以有同名函数,我们在使用的时候可以通过import关键字导入指定的模块就可以区分到底使用的是哪个模块中的foo函数
以下包含import和from……import的小小区别
model1.py

def foo():
	print "hello world"

model2.py

def foo():
	print "hai"

test.py

import model1
#输出hello world
model1.foo()

import model2
#输出hai
model2.foo()

注意 并不能直接使用foo()实现调用,必须将引入的模块名称当做一个对象,调用这个模块对象下的方法foo,这时才能实现调用。

如果使用from ……import的话

#导入模块
from model import *

#现在可以使用调用模块里包含的函数了
foo()

函数定义

函数最大的作用就是用来减少代码重复书写的,通过def来定义

def 函数名(参数列表)
	函数体

主函数长这样,hahah

if __name__='__main__':
	a=100
	foo()

函数参数

Python与其他语言的显著区别就是对参数的处理,在Python中,建树的参数可以有默认值,也支持可变参数,所以Python并不需要像其他语言一样支持函数的重载,只需要在调用的时候传入不同的参数就达到了和其他的重载效果。

def add(a=0,b=0,c=0):
	return a+b+c

print(add())
print(add(1))
print(add(1,2))
print(add(1,2,4))
print(add(c=5,a=1,b=3))  #传递参数时可以不按照设定的顺序进行传递
#在参数名称前面加上*表示args是一个可变参数
def add(*args):
	total=0
	for val in args:
		total+=val
	return total

#在调用的时候可以传入0个或者多个参数
print(add())
print(add(1))
print(add(1,2))
print(add(1,2,3))

静态方法和类方法

类中定义的方法都是对象的方法,但是对于一些不属于对象的方法定义要使用静态方法来解决,如:三角形类,通过传入三条边来进行面积和周长计算,其中判断是否构成三角形是在三角形对象没有创建出来的时候就调用了,所以不属于对象的方法。

from math import sqrt

class Triangle(object):
	def __init__(self,a,b,c):
		self._a=a
		self._b=b
		self._c=c

	@staticmethod
	def is_val(a,b,c):
		return a+b>c and a+c>b and b+c>a
	
	def perimeter(self):
		return self._a+self._b+self._c


def main():
	a,b,c=3,4,5
	#静态方法和类方法都是通过给类发消息调用的
	if Triangle.is_val(a,b,c):
		t=Triangle(a,b,c)
		print(t.perimeter())
	else:
		print('不能构成三角形‘)

if __name__=='__main__':
	main()