Python function & method 探究

本文探讨了Python中函数和方法的定义与调用,详细阐述了参数的类型、必要参数与默认值、参数排列及传递方式。同时,介绍了返回值的类型,包括类、基本数据类型和函数,并解析了系统定义的函数变量,如__doc__、__call__等。此外,还提及了Python的内建函数及其重要性。
摘要由CSDN通过智能技术生成


函数或者方法可以理解为将一系列的计算过程封装在一起,在实现相似的功能时,可以通过使用函数来减少代码量。

函数定义与调用

函数定义主要思考的问题是,这个函数实现什么功能,怎么才能使用它(参数),函数为调用者提供什么(返回值),函数如何实现等问题。

1.参数

1.1 参数值的类型

由于python语言中的变量都是引用型的变量,在函数定义时不需要特定的指出参数的类型。

def func(*arg1,**arg2):
		print('function run')

但在python中可通过*来表示函数接受0个或多个用,分割的变量作为参数,用**来表示函数可将0个或多个键值对作为参数。

# 不含参数
>>> func()
function run

# 使用多个变量做参数
>>> v1,v2=0 

>>> func(v1)
function run

>>> func(v2)
function run

>>> func(v1,v2)
function run

# 使用键值对作为参数
>>> func(k1='1')
function run

>>> func(k1='r',k2='u',)
function run

>>> d = dict(k1='one',k2='two')
>>> func(d)
function run

1.2 必要参数及默认值

若将上述函数改为

   def func(arg1,*arg2,**arg3):
 		print('function run')

其中arg1为必要(required)参数,arg2,arg3为可选(optional)参数。在调用函数时,若不给定arg1,就会提示缺少位置参数。

>>> func()
Traceback (most recent call last):
		File "<stdin>", line 1, in <module>
TypeError: func() missing 1 required positional argument:'arg1'	

# 给定任意类型的arg1,甚至是计算表达式
>>> func(1)
function run
>>> func('hello')
function run
>>> func(3+2)
function run

在为必要参数arg1设置默认值后,可直接用函数名调用参数。修改函数为

def func(arg1='default',*arg2,**arg3):
	print('function run')
	print(arg1)

直接调用函数

>>> func()
fucntion run
arg1

1.3 参数排列

当函数含有多个必要参数,在调用函数时,可通过位置、关键字或两者组合,来标识传递的值对应哪一个参数。

>>> def func(arg1,arg2,arg3):
   		print('fucntion run')
   		print('{:} is arg1\'s value'.format(arg1))
    	print('{:} is arg2\'s value'.format(arg2))
    	print('{:} is arg3\'s value'.format(arg3))

# 按位置区分
>>> func(4,96,8)
fucntion run
4 is arg1's value
96 is arg2's value
8 is arg2's value

# 按关键字区分
>>> func(arg2='hello',arg1='hi',arg3='ok')
fucntion run
hi is arg1's value
hello is arg2's value
ok is arg3's value

# 按关键字和位置区分 
>>> func('first',arg3='third',arg2='second')
fucntion run
first is arg1's value
second is arg2's value
third is arg3's value
#Ps:keyword argument、positional argument 同存在时,必须将位置参数放在前面
>>> func(arg3='third','second',arg1='first')
 	File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument

1.4 参数传递

在其他语言中,如Java,参数传递分为值传递(传变量值)和引用传递(传变量的逻辑地址),他们之间的区别主要在函数能否改变原变量的值
python 中的变量都是引用类型,故函数的参数传递都是引用传递
如何做到控制能否改变元变量的值,python采用可变类型(list、dictionary)和不可变类型(tuple、string、number)来控制。

# 向列表中增加一个值
>>> def change(arg):
    	print(id(arg))
    	arg.append(3)
    	print(id(arg.append(3)))
   
# 传入可变类型
>>> b=[]
>>> id(b)
1934364555080
>>> change(b)
1934364555080
1934364555080
# 可见变量所对应的地址没有发生改变,实现了对原变量值的修改
>>> b
[3]
>>> id(b)
1934364555080

#传入不可变类型
# 试图将字符串首字母转化为大写
>>>def change(arg):
   		print(id(arg))
   		arg.capitalize()
   		print(id(arg.capitalize()))
   
>>>a = 'string'
>>>change(a)
1934363823048
1934366339904     
# 调用capitalize()函数会生产新的字符串,原变量并未发生改变
>>>a
string
	

2.返回值

在函数的使用过程中,了解返回值的类型,有助于程序逻辑的编写。使用内建函数type()查询返回值类型。

2.1 返回值为类

可直接使用类的方式以及属性。

>>> import datetime
>>> def func():    
  			return datetime.date(2019,5,1)
>>> type(func())
<class 'datetime.date'>

# 使用help(module_or_class_name)函数查询模块或类的详细信息
>>> help(datetime.date)
Help on class date in module datetime:

class date(builtins.object)
 |  date(year, month, day) --> date object
 .....................  
 
# 直接使用类的方法,判断是星期几
>>> func().isoweekday()
3
# 直接查看类的(月份)属性
>>> func().month
5

2.2 返回值为基本数据类型

返回值为list、tuple、dictionary、number、string等基本数据类型,可以直接使用对象所含有的方法。

>>> def func():
	 return 'string'

>>> type(func())
<class 'str'>
# 返回值为字符类型数据,直接使用其split函数
>>> func().split('r')
['st', 'ing']	

2.3 返回值为函数

使用lambda表达式定义一个匿名函数。其语法为lambda arguments: return value or expression

def ReturnAFuction():
    return lambda x:x**2
# 查看函数返回值类型
>>>type(ReturnAFuction())
<class 'function'> 
# 将函数赋值给新变量   
>>>f = ReturnAFuction()
>>>f(9)
>>>81

3.系统定义的函数变量

在定义函数时,python会为默认会为函数定义一些方法或属性。根据python的 变量命名规则 1 ,这些方法或者属性都属于系统定义的变量。可以在官方文档中查询所有系统定义的变量

>>> def func():
		pass   #函数体为空
>>> for i in dir(func):
...     print(i)
... 
__annotations__
__call__
__class__
__closure__
__code__
__defaults__
__delattr__
__dict__
__dir__
__doc__
__eq__
__format__
__ge__
__get__
__getattribute__
__globals__
__gt__
__hash__
__init__
__init_subclass__
__kwdefaults__
__le__
__lt__
__module__
__name__
__ne__
__new__
__qualname__
__reduce__
__reduce_ex__
__repr__
__setattr__
__sizeof__
__str__
__subclasshook__

部分系统属性或函数说明:

  1. __doc__ 属性

    该属性是对象(类、函数、模块)的描述。通常为对象体内第一个用3个单引号'或双引号''的部分。如下例:

    >>> def func():
        """This is a document for function func
        
        this area should be usge of this function
        """
        
        """
        normal comment 
        """
        	return 'string'
    
    >>> func.__doc__
    'This is a document for function func\n    \n    this area should be usge of this function\n    '
    

    Python编码风格约定:如果文档字符串中有更多的行,那么第一行为对象的简要概述,第二行应该是空的,以将摘要与描述的其余部分分隔开。以下几行应该是一个或多个段落,描述对象的调用方法等。
    除此之外,也可以通过 赋值给__doc__这种方式,为函数添加说明。

  1. __call__() 方法调用函数
    >>> func.__call__()
    >>> 'string'
    
  2. __name__ 属性,返回对象名
    >>> func.__name__
    >>> 'func'
    
  3. __class__属性,返回实例所属的类
  4. __module__属性,返回对象所属的模块
  5. __sizeof__() 方法,返回对象多占内存大小
    >>> func.__sizeof__()
    >>> 112
    

内建函数

Python 内置了大约68个内建函数,不需要 import语句2 可直接使用。

下表为Python全部的内置函数,可以在这里查看官方文档中关于内建函数的功能以及使用方法。

abs()dict()help()min()setattr()
all()dir()hex()next()slice()
any()divmod()id()object()sorted()
ascii()enumerate()input()oct()staticmethod()
bin()eval()int()open()str()
bool()exec()isinstance()ord()sum()
bytearray()filter()issubclass()pow()super()
bytes()float()iter()print()tuple()
callable()format()len()property()type()
chr()frozenset()list()range()vars()
classmethod()getattr()locals()repr()zip()
compile()globals()map()reversed()__import__()
complex()hasattr()max()round()
delattr()hash()memoryview()set()

常用内建函数说明:

函数功能
print()向控制台输出
input()从控制台输入
open()将文件操作
help()显示对象的帮助信息
type()查询对象类型
format()格式控制
len()对象包含的item个数
iter()使用可迭代对象生成一个迭代器
next()获取迭代器的下一个值
range()生成一个序列
dir()显示对象可用的属性和方法

注解


  1. Python特殊变量命令含义
    __name__为系统变量,都可以访问到;
    __name为保护变量,模块中为不可见,但对于类来说,在父类中用此方式定义的变量或方法,子类可以使用_class__name来访问,防止子类方法名重写(override后子类对象就不能直接调用父类的该方法,可以通过实例化父类对象调用)。不同于重载(overload 函数名相同,参数不同),重载可以发生在一个类中 ;
    name为普通变量;
    name_避免与python关键字重复(约定);
    _name不能使用from module import *(通配符方式)引入该类型变量,但可通过常规方式from moudle._name import * 导入。 ↩︎

  2. import 包或者单个模块
    将自己编写的module(单个.py文件)或是第三方包放到 sys.path 所包含的文件夹下,就可以使用import语句导入自定的或者第三方包。 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值