python学习06-函数

一、函数的定义及语法

函数一词来源于数学,编程中的"函数"与数学中的函数与欧很大的不同。
  (BASIC中叫subroutine,C中叫function,java中叫method)

定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,想执行这个函数,只需调用其函数名即可。 

特性:

  1. 减少重复代码
  2. 使程序变得可扩展
  3. 使得程序变得易维护
# 无参函数
def sayhi(): # 函数名(小写即可)
    print("Hello,I‘m nobody!")

sayhi()   # 调用函数,函数名指向上述代码指向的内存位置,加上括号才是执行代码
print(sayhi)   # 函数sayhi指向的内存地址

# 单个参数的函数
def sayhi(name):
    print("hello",name)
    print("my name is black girl....", name)
sayhi("tracy")

# 多个参数函数
def calc(x,y):   # 定义算数函数
    res = x**y
    return res   # 返回函数执行结果
a,b = 5,8
c = calc(a,b)    # 结果赋值给变量c
print(c)
calc(2,10)       # 直接写入参数
二、函数的参数

参数的作用:可以让函数更灵活,不只能做死动作,还可以根据调用时传参的不同来决定函数内部的执行流程。

形参:只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值

def calc(x,y):   # 形参
    res = x**y
    return res
a,b = 3,5
c = calc(a,b)    # 实参
print(c)
d = calc(2,3)    # 实参

默认参数:

def stu_register(name,age,country,course):
    print("注册学生信息".center(50,‘-‘))
    print("姓名:",name)
    print("age:" ,age)
    print("国籍",country)
    print("课程",course)

stu_register("山炮",22,"CN","python_devops")
stu_register("丰收",23,"CN","linux")

‘‘‘
    由于很多人国籍都是中国,可以将country设置为默认参数
    默认参数:
‘‘‘
def stu_register(name,age,course,country="CN"):  # 非默认参数不能跟在默认参数后面
    print("registration info".center(50,‘-‘))
    print(name,age,country,course)

stu_register("jack",22,‘c++‘)     # 实参和形参按顺序一一对应
stu_register("rain",32,‘dance‘,‘Korean‘)
stu_register("Alfa",21,‘python‘)

关键字参数:

  应用场景:正常情况下,给函数传参数要按顺序,不想按顺序可以用关键参数
  定义:指定了参数名的参数就叫关键参数
     关键参数必须放在位置参数(以位置顺序确定对应关系的参数)之后

def stu_register(name,age,course,country=‘CN‘):
    print("注册学生信息".center(50,‘-‘))
    print("姓名:",name)
    print("age:" ,age)
    print("国籍",country)
    print("课程",course)

stu_register("绮珊",course=‘Python‘,age=22,country=‘JP‘)  # 后三个均为为关键参数置于name位置参数之后
# stu_register("杉树",course=‘Python‘,22,country=‘JP‘)    # 22为位置参数不能放在关键参数course之后
# stu_register("曼玉",22,age=25,country=‘JP‘)    # age获得多个赋

非固定参数(动态参数):

  形式参数中出现*,传递的参数就可以不再是固定个数,会将传过来的所有参数打包为元组。

def send_alert(msg,*users):
    for u in users:
        print(‘报警发送给‘,u)

# 方式一:
# 报警,十个运维人员
send_alert(‘注意系统资源别浪了‘,‘Alex‘,‘jack‘,‘tracy‘,‘wood‘)

# 方式二:
# send_alert(‘注意内存紧张‘,[‘alex‘,‘jack‘,‘tracy‘,‘wood‘])  # 传入的参数是数据
send_alert(‘注意内存紧张‘,*[‘alex‘,‘jack‘,‘tracy‘,‘wood‘])   # 传入的参数是数组内的元素
# 传入的参数由([‘alex‘,‘jack‘,‘tracy‘,‘wood‘]) ————>(‘alex‘,‘jack‘,‘tracy‘,‘wood‘)

  如果动态参数后还有参数

# 方法一:
def send_redalert(msg,*users,age):
    for u in users:
        print(‘CPU紧张‘,u)
# send_redalert("alex","rain",22)   # 22也会传递给*users
send_redalert("alex","rain",age=22)

#  方法二:
def func(name,*args,**kwargs):
    print(name,args,kwargs)

func(‘Alex‘,22,‘tesla‘,‘500w‘,addr=‘湖北‘,num=123332313)
# Alex (22, ‘tesla‘, ‘500w‘) {‘addr‘: ‘湖北‘, ‘num‘: 123332313}

d = {‘degree‘:‘primary school‘}
func(‘Peiqi‘,**d)
三、函数的返回值

返回值:函数外部的代码要想获取函数的执行结果,可以在函数里用return语句把结果返回。
注意:
  1、函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so可以理解为return语句代表着函数的结束
  2、如果未在函数中指定return,那这个函数的返回值为None

def stu_register(name,age,course=‘PY‘,country=‘CN‘):
    print("注册学生信息".center(50,‘-‘))
    print("姓名:", name)
    print("age:", age)
    print("国籍", country)
    print("课程", course)
    if age > 22:
        return False
    else:
        return True

registration_status = stu_register(‘阿斯顿‘,22,course="全栈开发",country=‘JP‘)

if registration_status:
    print("注册成功".center(50,‘-‘))
else:
    print("too old to be a student.")

‘‘‘
    执行到return语句后,停止执行函数并返回结果
‘‘‘
def stu_register(name,age,course):
    print(name,age,course)
    #
    # if age > 22:
    #     return ‘sdfsf‘  # 返回值可以是任意值
    # else:
    #     return True
    #
    # return None      # 到return语句后,停止执行函数并返回结果
    # print(‘hahah‘)
    # return 1
    return [name,age]
status = stu_register(‘Peiqi‘,29,‘安保‘)
print(status)
四、全局和局部变量

局部变量:函数内定义的变量,只能在局部生效
全局变量:定义在函数外部一级代码的变量,整个程序可用(由上到下可用)
      在函数内部可以引用全局变量。
变量查找顺序:如果全局和局部都有一个变量,函数查找变量的顺序是由内而外的。两个函数间互不可见

name = "Black girl"       # 全局变量

def change_name():
    # global name         # (不建议使用global)在函数内修改全局变量,不能放在函数内局部变量后面
    name = "黑色的姑娘"     # 局部变量
    print("在",name,"里面...",id(name))

change_name()
print(name,id(name))   # 与函数内的变量内容完全不同
‘‘‘
输出结果:
    在 黑色的姑娘 里面... 4302993904
    Black girl 4316351984
‘‘‘

函数内可以修改字典、列表、集合、对象、类、元组内的列表

names = [‘Alex‘,‘Black Girl‘,‘Peiqi‘]
def change_name():
    names = [‘Alex‘]
    del names[2]      # names整体的内存地址不能修改只能引用,但其内部的元素是可以修改的
    names[1] = "黑姑娘"
    print(names)

change_name()
print(names)
‘‘‘
输出结果:
    [‘Alex‘, ‘黑姑娘‘]
    [‘Alex‘, ‘黑姑娘‘]
‘‘‘
  • 在函数中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
  • 全局变量作用域是整个程序,局部变量作用域是定义该变量的函数。
  • 当全局变量与局部变量同名时,在定义局部变量的函数内,局部变量起作用;在其它地方全局变量起作用。
五、作用域(scope)

作用域定义:一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域

  • python中一个函数就是一个作用域,局部变量放置在其作用域中
  • C# Java中作用域{}
  • 代码定义完成后,作用域已经完成,作用域链向上查找
age = 18
def func1():
    age = 73
    def func2():
        age = 84
        print(age)

    return 666

val = func1()
print(val)
‘‘‘
输出:666
‘‘‘

# 函数名可以当作返回值
age = 18
def func1():
    age = 73
    def func2():...
    return func2   # 返回一个函数名# val = func1()
print(val)
‘‘‘
输出:<function func1.<locals>.func2 at 0x101462598>
‘‘‘

# 代码写完之后作用域已经生成,不管函数名传到哪里,只要执行都回回定义的地方往上找
age = 18
def func1():
    age = 73
    def func2():
        print(age)
    return func2   # 返回一个函数名不带括号

val = func1()
val()
‘‘‘
输出结果:73
‘‘‘
六、嵌套函数

嵌套函数,就是指在某些情况下,您可能需要将某函数作为另一函数的参数使用。

  • 函数内部可以再次定义函数
  • 执行需要被调用
  • 嵌套函数寻找变量的顺序(一层一层往上找)
def func1():
    print(‘alex‘)

    def func2():
        print(‘eric‘)

func1()
‘‘‘
输出:
    alex
‘‘‘

def func1():
    print(‘alex‘)

    def func2():
        print(‘eric‘)

    func2()

func1()
‘‘‘
输出:
    alex
    eric
‘‘‘
寻找变量,先找自己的函数内,没有就找全局变量(一层一层往上找)
age = 19

def func1():
    # age = 73
    print(age)   # 寻找变量,先找自己的函数内,没有就找全局变量(一层一层往上找)
    def func2():
        age = 84
        print(age)   # 寻找变量,优先自己函数、再找父级、爷爷级,最后找全局变量
    func2()
func1()
# 输出: 73  84
‘‘‘
    示例
‘‘‘
age1 = 19
def func1():
    age1 = 73
    def func2():
        print(age1)
    func2()

局部变量位置调整 第三章第20视频需要重新看

age = 19
def func1():
    def func2():
        print(age)
    func2()
    age = 73
func1()
‘‘‘
    执行报错,73在func2后面,func2不知道该取哪个参数
‘‘‘

原文地址:https://www.cnblogs.com/xiugeng/p/8463305.html

时间: 2024-10-10 20:55:25

python学习06-函数的相关文章

python学习06

Python学习-day06 1.python中的switch/case语句 python中本来是没有switch/case语句的,可以通过字典与函数结合的方式达switch/case的效果. 如下: 注意:from__future__  import division :作用是让计算结果中有小数的显示成小数,不会取整. 2.内置函数 (1)函数:  abs() --------->返回绝对值 max() -------->取最大值 min()  --------->取最小值 len()

python 学习笔记 函数和类

与java类似 python的函数也是出于可以复用才使用的 如果一段代码没有复用的价值就可以不用函数 一般的函数可以定义成这样: def func(a,b=123,*arg,**args): for x in arg:#arg是一个list print x for x,y in args.items():#args是一个dict print x,y print 'a:',a print 'b:',b func(1,1,2,3,4,c=1,d=2) 结果: 2 3 4 c 1 d 2 a: 1 b

Python学习之函数篇

python查看对象,函数帮助文档:.__doc__,例:str.split.__doc__ 查看详细对象,函数文档:help(),例:help(str.split) 函数参数可设置默认值 如果不能提前确定参数个数,可以采用可变参数,因此,python不必支持函数的重载,更简单,更方便的实现重载 函数示例: 求最大公约数.最小公倍数函数封装 原文地址:https://www.cnblogs.com/baobao2201128470/p/10884153.html

python学习笔记 - 函数,集合,包,模块

一.函数 a=1, b=2, 交换值 定义中间量c,C=None, a,b=b,a a,b,c=1,2,3 sys.argv 实现指定的某些功能,使用的时候可以直接调用,简化代码,提高代码复用性 def fun():#定义一个函数,后面是函数名                print("Hello World")#函数体 例如: 1.def sayHello(): print("Hello World") sayHello()  --调用 2.def sayNam

python学习之函数

1.函数名可以被赋值 比如: def aaa(): pass b = aaa//将函数名字赋值给b b()//跟aaa()效果一样 2.return 2.1.如果函数不写return的话,会默认返回None 2.2.return后,函数下面的语句不会被执行,中断函数操作 2.3.return个什么东西都行,哪怕是个列表..... 3.pycharm使用断点调试的话,需要用debug模式(向右小箭头的小虫子) 4.参数: 默认参数必须写在后边 def aaa(a1, a2 = 1): pass//

Python学习之函数详解

函数是对程序逻辑进行结构化或过程化的一种编程方法.能将整块代码巧妙地隔离成易于管理的小块,这样在以后的python开发中十分重要,可以使你的程序更加简洁,有逻辑,可读性强. 一.函数的调用 Python内置了很多有用的函数,我们可以直接调用.要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数.可以在交互式环境中用help()查看关于调用函数的相关信息 >>> abs(100)100 >>> help(abs) Help on built-i

python学习之函数进阶三

一.模块介绍 os模块常用方法 os.getcwd()    #获取当前工作目录 os.listdir("F:\\")    #获取指定目录下的所有文件和目录 os.remove('b.json')    #删除指定文件 os.stat('a.json')    #获取文件属性 os.chmod()        #修改文件属性 os.mkdir('hyh')    #创建目录 os.rmdir('hyh')    #删除目录 os.system('dir')    #运行shell命

python学习之函数学习进阶

1.名称空间 python有三种名称空间 内置名称空间: 随着python解释器的启动而产生 print(sum) print(max) 全局名称空间: 文件的执行会产生全局名称空间,指的是文件级别的定义名字都会放入该空间 x = 11 if x == 11:     print(x) 局部名称空间: 调用函数时会产生局部名称空间,只在函数调用时临时绑定,调用结束时解绑 x = 1000 def foo():     x = 1     print(x) foo() print(x) 作用域:

Python学习之--函数

Function,函数,主要是为了:1提高代码的复用程度,2将程序模块化. 定义函数 在Python中,使用def 用来定义函数,一般函数的定义如下: def name(arg1,arg2,....): statements return value 其中,return 用来返回函数执行的结果 一个简单的sample如下: >>> def times(x,y): ... return x*y ... >>> times(5,2) 10 >>> 函数执行