首页 > 编程语言 >python3函数

python3函数

时间:2023-05-28 09:33:07浏览次数:35  
标签:函数 形参 print def fun 实参 python3

1、介绍

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

在python中,可以直接在.py文件中,通过关键字def创建函数。

2、函数与解释型

python是解释型编程语言,从上到下解析,所以在调用函数时,该函数必须已经被声明。

  • 如果是在函数B声明之前,py文件中直接调用B,那么pycharm会提示异常
  • 如果是在函数B声明之前,函数A中调用函数B
    • 调用函数A的代码如果是在函数A之前,那么参考前一种场景,pycharm仍然报错
    • 调用函数A的代码在函数A与B之间,那么pycharm不会报错,但是执行时会提示函数B未定义
    • 调用函数A的代码在函数B之后,或者在其它py文件中,则正常执行
# A() # pycharm直接提示异常,函数A尚未定义
def A():
    print('A')
    B() # pycharm不会提示异常
# A() # pycharm不会提示异常,但是执行时提示B未定义
def B():
    print('B')
A() # 正常执行

3、参数

3.1 形参和实参

(1)定义

  • 形参:在函数声明处的括号里的参数。python是弱语言类型,形参只需要声明参数名称,而不需要声明类型
  • 实参:调用函数时传入的值,决定对应形参的类型

(2)声明和使用

一般声明和使用函数时,需要形参与实参个数匹配,否则会报错

同时,函数内部使用形参,会根据参数作用预设类型,调用对应的方法和属性

所以,实参传递时不仅需要个数匹配,还需要类型匹配,否则会因为调用了形参所不具备的属性或方法而报错

换句话说,即形参列表和实参列表的一一对应

(3)形参的类型声明

def fun(name:str=''):

注意,这只是为了方便函数内部使用时,方便属性和方法的提示,并不会影响形参的类型或值

3.2 参数名设置

如果是直接设置实参,则实参的顺序必须和形参的顺序一致。

而如果全部或部分参数基于参数名设置实参,则可以相互颠倒。当然,实参个数仍然需要与实参个数一致

注意,如果是部分参数基于参数名设置,则这部分参数需要处于函数调用的后面部分,而前面部分直接设置的参数会一一与形参的前面部分对应传递和接收。否则,会报错

def fun(name:str, age:int, sex:str):
    pass
fun('gg', 18, 'girl')
fun('zz', sex='boy', age=15)
fun(sex='boy', name='xc', age=20)

3.3 默认值

 如果是不设置形参的默认值,则实参的个数和形参个数必须一致

而如果全部或部分形参设置了默认值,则可以对这些形参不设置实参,函数内部会使用默认值。当然,也是可以进行设置的

注意,如果是部分形参设置默认值,则这部分形参需要处于函数声明的后面部分,而前面部分为未设置默认值的形参。否则,会报错

def fun(name:str, age:int=18, sex:str='boy'):
    pass
fun('zz')
fun('gg', 15)
fun('a', sex='girl')

3.4 不定长参数

不定长参数有两种形式:

  • *args
    •  如果需要,则在形参的末尾进行声明,重点是*字符,args可以是其它名称
    • 用于接收函数中超出形参声明个数的实参,且超出部分实参是直接设置,而非通过参数名设置
    • 在函数内,args作为tuple类型,用于读取接收的实参。当不存在超出范围的实参时,args为空tuple
def fun(name, *args):
    print(args)
fun('aa', 'bb', 18) # 执行时,('bb', 18)
# fun('aa', 'bb', age=18) # 执行时,报错,不存在age
  • **kwargs
    •  如果需要,则在形参的末尾进行声明,重点是**字符,kwargs可以是其它名称
    • 用于接收函数中超出形参声明个数的实参,且超出部分实参是通过参数名设置,而非直接设置
    • 在函数内,kwargs作为dict类型,用于读取接收的实参。当不存在超出范围的实参时,args为空dict
def fun(name, address='',**kwargs):
    print(kwargs)
# fun('aa', 'bb', 18) # 执行时,报错。超出接收个数
fun('aa', sex='boy', age=18) # {'sex': 'boy', 'age': 18}
  •  混合
    • 同时使用*args和**kwargs,必须是*args声明在前,否则pycharm会提示错误
    • 仍然需要遵循使用参数名直接设置在后面部分
    • 此时,超出形参声明个数的部分中,直接设置的会被args接收,使用参数名设置的会被kwargs接收
def fun(name, address='', *args, **kwargs):
    print(args)
    print(kwargs)
# fun('aa', 'bb', 18, 'ggz', sex='boy', address='uuu', age=20) # 执行时,报错。address被重放设置
fun('aa', 'bb', 18, 'ggz', sex='boy', email='uuu', age=20) # 执行时,报错。address被重放设置
"""
(18, 'ggz')
{'sex': 'boy', 'email': 'uuu', 'age': 20}
"""

3.5 传值和传地址

  •  对于number、str和tuple是传值
  • 对于其它类型是传地址
  • 需要注意,传地址时,如果在函数内部对形参使用=进行赋值,那么就不再是传地址,不会对实参造成影响,而是另外创建或关联对象

4、其他

4.1 返回值

(1)函数可以没有返回值,执行完毕即退出。也相当于返回None值

(2)可以使用return关键字返回一个或多个值,用逗号分隔。

(3)return本身有立即结束函数的意思,可以不跟随参数,相当于返回None

(4)当返回多个值时,相当于返回一个tuple类型。此时要么用一个参数接收整个的tuple,要么用tuple长度的参数去分别接收tuple各元素,否则会报错

4.2 pass

作为占位的关键字,不执行任意功能

4.3 python不存在重载机制,即在一个函数中函数名必须唯一

5、匿名函数

基于lambda创建匿名函数,其只有一个表达式而非代码块
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数

x = lambda a : a + 10
print(x(5))

6、特殊参数

实际上,模块、类、方法和函数都可以作为对象,被传递。

import os

print(type(os))
def fun1():
    print('abc')
def fun2(fun):
    print(type(fun))
    fun()
fun2(fun1)
"""
<class 'module'>
<class 'function'>
abc
"""

7、私有函数和私有模块变量

所谓私有,即只能在当前py文件中使用,而不能在其它py文件中调用。

但是需要注意,私有函数和私有变量声明之后,在其他py文件中只有使用from ... import 导入,私有设置才有效。而直接通过import导入,则可以任意调用其公有或私有的函数和模块变量。

python中有两种方式定义私有函数和私有模块变量:

(1)添加_前缀

t1.py

name = 'abc'
_name2 = 'zzz'
def test():
    print('111')
def _test2():
    print('222')

t2.py

from t1 import *

print(name)
# print(_name2) # pycharm提示异常
test()
# _test2() # pycharm提示异常

(2)在模块变量__all__中定义公有函数和公有模块变量

__all__在py文件的开始还是末尾,不影响

t1.py

__all__ = ['name', 'test']

name = 'abc'
name2 = 'zzz'
def test():
    print('111')
def test2():
    print('222')

t2.py

from t1 import *

print(name)
# print(name2) # pycharm提示异常
test()
# test2() # pycharm提示异常

 

标签:函数,形参,print,def,fun,实参,python3
From: https://www.cnblogs.com/wd404/p/17319117.html

相关文章

  • strcpy函数
    strcpy函数#include<stdio.h>#include<string.h>#include<stdlib.h>char*mystrcpy(char*a,char*b){if(NULL==a||NULL==b){printf("参数错误\n");exit(-1);}char*p=a;while(*p++=*b++);returna;}intmain(......
  • strcmp函数
    strcmp函数#include<stdio.h>intmystrcmp(char*a,char*b){while(*a&&*b&&*a==*b){a++;b++;}if((*a-*b)>0){return(*a-*b);}elseif((*a-*b)<0){return(*a-*b);}else{return0;......
  • python---引用其他py文件中的函数-yuan
    /user/test:....A........a.py....B........b.pya.py:deffa(): print("a")b.py想调用a.py中的函数fa():sys添加路径方法importsyssys.path.append("test/A")fromaimport*fa()init方法-1:在A文件夹和B文件夹中新建__init__.py文件,目录变成:test:....A...........
  • GaussDB(DWS)条件表达式函数返回错误结果集排查
    摘要:条件表达式函数中出现结果集不一致问题,我们首先要考虑是否入参数据类型不一致导致出参不一致。本文分享自华为云社区《GaussDB(DWS)条件表达式函数返回错误结果集排查》,作者:yd_211369925。(一)案例背景客户使用greatest获取并返回参数列表中值最大的表达式的值,子查询中查询......
  • Jmeter函数助手33-split
    split函数用于根据分隔符拆分传递给它的字符串,并返回原始字符串。Stringtosplit:填入需要转换的字符串函数名称。用于存储在测试计划中其他的方式使用的值:存储结果的变量名Stringtospliton.Defaultis,(comma):填入一个分隔符,不填默认是英文逗号"," 1、分隔符不填则......
  • 使用fx.Parallel方法并发执行函数时遇到的惰性计算的坑
    错误的写法packagescripts_stroageimport("encoding/hex""fmt""github.com/zeromicro/go-zero/core/fx""math/rand""sync""testing""time")varfns[]func()......
  • Python函数
    Python中的函数是可重用的代码块,用于执行特定的任务或操作。函数通过接受输入(参数)并返回输出(返回值)来完成其功能。以下是一个简单的Python函数的例子:defgreet(name):"""打招呼的函数"""print("Hello,"+name+"!")#调用函数greet("Alice")在上面的例子中,我们定......
  • 欧拉函数|欧拉函数及其性质|欧拉函数及其性质证明 一文说明白
    欧拉函数在数论,对正整数n,欧拉函数是小于等于n的正整数中与n互质的数的数目。读作phi。\(\LaTeX\)大写:\phi\(\phi\),小写:\varphi\(\varphi\)部分选自百度百科欧拉函数的性质以下所有\(p\)表示质数性质1\[\varphi(p)=p-1\]性质1的证明根据质数的定义,比p小的数......
  • js原型prototype(实例构造函数的属性) __proto__(实例对象的属性) constructor(实例
    functionPerson(name,age){this.name=namethis.age=age}Person.prototype.sayHi=function(){//原型是公共方法解决构造函数new对象公共属性和方法的内存浪费console.log(this.name+'sayhi!!')}constp1=newPerson('aa',12)constp2=new......
  • nvm安装多版本node,vscode不识别npm函数解决方案
    问题:npm:无法将“npm”项识别为cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次的解决方案解决办法:(首先确定cmd当中是能够正常显示node和npm版本问题) 1、第一种办法:设置管理员权限 2、第二种办法:在Vscode......