09-函数(中)

课堂笔记




1. 函数的返回值

  • 返回值就是函数执⾏以后返回的结果

                         (计算任意参数和的函数返回值)
    
def fn(*args):
    r=0
    print(args)#元组
    for i in args:
   	   r+=i
    return r
    

   
print(fn(1,2,3))
(1,2,3)
6

在这里插入图片描述


  • 通过return来指定函数的返回值

                        (通过return函数返回了一个'python'的字符串)
    
def fn(*args):
    r=0
    print(args)#元组
    for i in args:
       r+=i
    return 'python'

print(fn(1,2,3))
python

  • return后⾯可以跟任意对象,返回值甚⾄可以是⼀个函数
    (函数的两种方式返回)

                       (方式一)
    
def fn(*args):
    r=0
    print(args)#元组
    for i in args:
        return 123
        r+=1
        print(r)
    def fn1():

        print("我是fn1")
        return {"a":123}
    return fn1

s=fn()
#print(fn(1,2,3,4))
print(s())
()
我是fn1
{'a': 123}
                         (方式二)
def fn(*args):
    r=0
    print(args)#元组
    for i in args:
        
        r+=1
        print(r)
    def fn1():

        print("我是fn1")
        return {"a":123}
    return fn1()

s=fn()
#print(fn(1,2,3,4))
print(s)
()
我是fn1
{'a': 123}


  • 当你不写return语句,和只写一个return语句时,返回值为None

                fn1()与fn2()  fn1只有一个return    fn2() 无return 
    
def fn1(*args):

    return

def fn2():
    a=1


print("有return",fn1())#有return None
print("无return",fn2())#无return None

#当你不写return语句,和只写一个return语句时,返回值为None
return Nonereturn None

  • 在函数中return 后面的代码不在执行
#在函数中return 后面的代码不在执行
def fn():
    print("return 前")
    return 123
    print("return 后")#return 前
                      #123

s=fn()
print(s)
return123

  • 循环中插入return语句其所有后面的语句不会执行
# break和continue 一定只能在循环中使用,只会对当次循环起效果
def fn():
    for i in range(9):
        print("abc")
        return f"第{i}次结束"
        print("123")
        if i==5:
            break
            return
        print( i)
    print("循环执行结束")
r=fn()
print(r)

#abc
#第0次结束
abc
第0次结束

  • 循环中break在return前return不会执行
#有return 函数提前结束
def fn():
    for i in range(9):
        print("abc")

        print("123")
        if i==5:
            break
            return
        print( i)
    print("循环执行结束")
r=fn()
print(r)
abc
123
0
abc
123
1
abc
123
2
abc
123
3
abc
123
4
abc
123
循环执行结束
None


2. ⽂档字符串

  • help()是Python中内置函数,通过help()函数可以查询Python中函数的⽤法
    在定义函数时,可以在函数内部编写⽂档字符串,⽂档字符串就是对函数的
    说明
def fn(a,b,c):
    #文档字符串是为了解释清楚一个自定义函数,各个参数有啥用
    """

    :param a:#作用 类型 默认值
    :param b:作用 类型 默认值
    :param c:作用 类型 默认值
    :return: 需不需要
    """
    return 123

help(fn)#简单的介绍

help(fn(a=1,b=2,c=4))#细致的介绍

简单的介绍help(fn)

Help on function fn in module __main__:

fn(a, b, c)
    :param a:#作用 类型 默认值
    :param b:作用 类型 默认值
    :param c:作用 类型 默认值
    :return: 需不需要

复杂的介绍help(fn(a=1,b=2,c=4))

class int(object)
 |  int(x=0) -> integer
 |  int(x, base=10) -> integer
 |  
 |  Convert a number or string to an integer, or return 0 if no arguments
 |  are given.  If x is a number, return x.__int__().  For floating point
 |  numbers, this truncates towards zero.
 |  
 |  If x is not a number or if base is given, then x must be a string,
 |  bytes, or bytearray instance representing an integer literal in the
 |  given base.  The literal can be preceded by '+' or '-' and be surrounded
 |  by whitespace.  The base defaults to 10.  Valid bases are 0 and 2-36.
 |  Base 0 means to interpret the base from the string as an integer literal.
 |  >>> int('0b100', base=0)
 |  4
 |  


3. 函数的作⽤域

  • 作⽤域(scope)
#函数作用域:概念:指的是变量生效的区域
#变量在函数内部的话,不能拿到函数外部使用
def fn():
    a=123
    print('函数内部:a=',a)

fn()#函数内部:a= 123
print('函数外部:a=',a) #调用不了a变量
Traceback (most recent call last):
函数内部:a= 123
   File "C:/Users/dell/PycharmProjects/untitled11/Day7/2.函数作用域.py", line 8, in <module>
     print('函数外部:a=',a) #调用不了a变量
 NameError: name 'a' is not defined

 Process finished with exit code 1
        (显示报错)

  • 作⽤域指的是变量⽣效的区域

  • 在Python中⼀共有两种作⽤域

在Python中一共有两种作用域
全局作用域
全局作用域在程序执行时创建,在程序执行结束时销毁(Python 垃圾回收机制:引用计数的功能,当计数为0时,就会销毁变量)
所有函数以外的区域都是全局作用域(相对的,函数嵌套)
在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问

函数作用域
函数作用域在函数调用的时创建,在调用结束时销毁
函数每调用一次就会产生一个新的函数作用域
在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
global 声明的变量是全局变量

b=456
a=b

def fn():
    global a
    a=123

print("fn前")
print("函数内部:a=",a)
print("函数外部:b=",b)
fn()
print("fn后")
print("函数内部:a=",a)
print("函数外部:b=",b)

fn前
函数内部:a= 456
函数外部:b= 456
fn后
函数内部:a= 123
函数外部:b= 456

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述



4. 命名空间

  • 命名空间实际上就是⼀个字典,是⼀个专⻔⽤来存储变量的字典
  • locals()⽤来获取当前作⽤域的命名空间
  • 如果在全局作⽤域中调⽤locals()则获取全局命名空间,如果在函数作⽤域中
    调⽤locals()则获取函数命名空间
  • 返回值是⼀个字典
    (全局变量中)
#全局变量中
a=1
b=2
c=3
d=4
#e=5
scope=locals()
print(scope) 

scope['e']=5
print(e)#5
print(scope)
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000257967CA470>,
              '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
              '__file__': 'C:/Users/dell/PycharmProjects/untitled11/Day7/3.命名空间.py', '__cached__': None,
              'a': 1, 'b': 2, 'c': 3, 'd': 4, 'scope': {...}}

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000257967CA470>,
              '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
              '__file__': 'C:/Users/dell/PycharmProjects/untitled11/Day7/3.命名空间.py', '__cached__': None,
              'a': 1, 'b': 2, 'c': 3, 'd': 4, 'scope': {...}, 'e': 5}

(函数中)

#函数作用域中
def fn():
    a=1
    b=2
    c=3
    d=4
    scope=globals() #globals()函数可以获取整个进程的全部全局变量
    scope['e']=5
    print(e)
    print(scope)

fn()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000020A99ABA470>,
                 '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/dell/PycharmProjects/untitled11/Day7/3.命名空间.py', 
                 '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'scope': {...}, 'e': 5, 'fn': <function fn at 0x0000020A99A61E18>}


5. 递归函数

  • 递归是解决问题的⼀种⽅式,它的整体思想,是将⼀个⼤问题分解为⼀个个
    的⼩问题,直到问题⽆法分解时,在去解决问题
#递归是解决问题的一种方式,它的思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题

#求10的阶乘

#函数用循环解决
def fn(n):
    for i in range(1,n):
        n*=i

    return n

r=fn(10)#3628800
print(r)


递归就是,从前有座山,山上有个庙,庙里有个小和尚和老和尚,老和尚对小和尚讲故事:
从前有座山,山上有个庙,庙里有个小和尚和老和尚,老和尚对小和尚讲故事:······
递归的简单理解:自己调用自己

3628800
  • 递归式函数有2个条件
    。1. 基线条件 问题可以被分解为最⼩问题,当满⾜基线条件时,递归就不
    执⾏了
    。2. 递归条件 可以将问题继续分解的条件
#无穷递归
"""
def fn():
    return fn()

fn()
"""

#递归的两个条件:
#1.基线条件,问题无法在分解的问题,当满足基线条件的时候,递归就不在执行了
#2.递归条键,可以将问题继续分解的条件

def fn(n):#定义的fn()就是要计算n的阶乘
    #基线条件
    if n==1:
        return 1
    return n*fn(n-1)
r=fn(10)
print(r)#r=10*9*8*7*6*5*4*3*2*1 3628800
3628800

在这里插入图片描述
在这里插入图片描述

  • 递归练习
#定义一个函数,用来检测任意一个字符是否为回文字符串
#efffhfffe 回文
#abcdedcba
str1="abcdedcba"
print(str1[1:-1])#对称打印 半开区间
def fn2(str1):
    if len(str1)<2:
        return  True
    elif str1[0]!=str1[-1]:
        return False
    else:
       
        return fn2(str1[1:-1])

print(fn2(str1))

bcdedcb
True

作业

#用一个函数实现一个判断用户输入的年份是否是闰年的程序

#1.能被4整除,



def fn(a):
    if a%4==0:
        print("该年为闰年")
    else:
        print("该年不为闰年")

while True:
    a=eval(input("请输入年份:"))
    fn(a)


C:\Users\dell\PycharmProjects\untitled11\venv\Scripts\python.exe C:/Users/dell/PycharmProjects/untitled11/Day7/作业/1.py
请输入年份:2001
该年不为闰年
请输入年份:2000
该年为闰年
请输入年份:2020
该年为闰年
请输入年份:2010
该年不为闰年
请输入年份:2012
该年为闰年
请输入年份:2008
该年为闰年
请输入年份:


def houzi(date):
    if date==10:
        a=1
        print(f"{date}天,吃了{a}")
        return a
    else:
        a= 2*(houzi(date+1)+1)
        print(f"{date}天,吃了{a}")
        return a




print("一共摘了:",houzi(1))






C:\Users\dell\PycharmProjects\untitled11\venv\Scripts\python.exe "C:/Users/dell/PycharmProjects/untitled11/python程序设计习题/第五章 循环结构/作业.py"
10天,吃了1
9天,吃了4
8天,吃了10
7天,吃了22
6天,吃了46
5天,吃了94
4天,吃了190
3天,吃了382
2天,吃了766
1天,吃了1534
一共摘了: 1534

Process finished with exit code 0

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值