2021.05.11 day10函数进阶

2021.05.11 day10函数进阶

函数的参数

1.位置参数和关键字参数
根据实参提供的方式不同,将实参分为位置参数和关键字参数
1)位置参数:调用函数的时候让实参和形参在位置上一一对应
2)关键字参数:调用函数是以‘形参名=值’的形式确定形参对应的实参。
3)位置参数和关键字参数混用:位置参数必须在关键参数前面,同时必须保证每个参都会有一次赋值

def func1(x, y, z):
    print(f'x:{x}, y:{y}, z:{z}')

位置参数

func1(10, 20, 30)
func1(10, 30, 20)

关键字参数

func1(x=10, y=20, z=30)
func1(z=30, x=10, y=20)

混用

func1(10, 20, z=30)
func1(10, z=30, y=20)
# func1(x=10, 20, z=30)   # SyntaxError: positional argument follows keyword argument

2.参数默认值
定义函数的时候可以直接在形参后面用=给形参赋默认值,
有默认值的参数在调用的时候可以不用传参
如果有的参数有默认值有的没有,有默认值的参数必须放在没有默认值参数的后面

def func2(x=10, y=20, z=30):
    # x = 100
    print(f'x:{x}, y:{y}, z:{z}')

func2()
func2(100)
func2(z=300)

def func3(z, x=10, y=20):
    print(f'x:{x}, y:{y}, z:{z}')

func3(100)
func3(z=200)
print(10, 20, end='\n', sep=',')
print(10, 20, sep=',', end='\n')

3.。参数类型说明
无默认参数的类型说明 - :类型名
有默认值的参数,默认值的类型就是参数对应的类型

def func4(x: str, y=''):
    x.split('\n')
    y.replace('you', 'me')

4.不定长参数
1)带*的不定长参数:在某个形参前加 * ,那么这个形参就是一个不定长参数,它可以接受任意多个实参。带 * 的参数本质就是一个元组,对应的实参是元组中的元素。注意: * 的不定长参数对应的实参必须用位置参数传参
2)带 ** 的不定长参数:在某个形参前加**,那么这个形参就是一个不定长参数,它可以接受任意多个实参。带两个星号的参数本质就是一个字典,对应的关键字参数就是字典中的键值对。
注意:** 的不定长参数对应的实参必须使用关键字参数传参

def func5(*x):
    print(x)

func5()
func5(10)
func5(10, 20)
func5(1, 2, 3, 4, 5)

1)定长参数在* 的不定长参数前,定长和不定长都适用位置参数传参

def func6(char, x, *nums):
    print(f'char:{char}, nums:{nums}, x:{x}')

func6('+', 10)
func6('-', 12, 34, 45)   # char, x, *nums = '-', 12, 34, 45

2)定长参数在*的不定长参数的后面, * 后面的定长参数必须用关键字参数传参

def func7(*nums, char):
    print(f'nums:{nums}, char:{char}')

func7(10, 20, char='*')

def func8(*, a, b, c):
    print(f'a:{a}, b:{b}, c:{c}')

func8(a=10, b=20, c=30)

3) ** 的使用

def func9(**x):
    print(x)
func9()
func9(x=10)
func9(a=10, b=20)
func9(m=1, n=2, a=3, b=100)

4)定长参数在 ** 的不定长前,定长即可以用位置参数也可以用关键字参数

def func10(x, **y):
    print(f'x:{x}, y:{y}')

func10(10, a=10, b=20)
func10(x=100, m=1, n=2)

5)定长参数不能放在对应不定长参数后面
6)带*的不定长参数和带
的不定参数可以一起用,带 * 的必须放在带两个星号的前面

def func11(*args, **kwargs):
    print(args, kwargs)
func11()
func11(10)
func11(10, 29, 9)
func11(a=2)
func11(a=10, b=20)
func11(1, 20, a=10)

函数的返回值

  1. 返回值
    返回值的作用就将函数内部的数据传递到函数外部
  2. 怎么确定函数返回值 - 怎么将函数内容的数据传递到外部
    在函数体中用return关键字来返回返回值(一个函数只有一个返回值)
    什么时候需要返回值:如果函数的功能产生了新的数据,将新的数据返回。
  3. 怎么获取函数返回值
    获取函数调用表达式的值就是获取函数返回值
    函数调用表达式 - 调用函数的语句
    函数调用表达式的值就是函数返回值,函数返回值能做的事情,函数调用表达式都可以做
  4. 函数调用过程
    第一步:回到函数定义的位置
    第二步:传参(用实参给形参赋值,这个时候要保证每个参数都有值)
    第三步:执行函数体
    第四步:执行完函数体的时候确定函数返回值
    (看执行函数体的时候有没有遇到return,如果遇到return,return后面的值是什么,函数返回值就是什么,
    并且在遇到return的时候函数直接结束。如果没有遇到return,函数返回值是None)
    第五步:回到函数调用的位置(这个时候函数调用表达式的值才是函数的返回值)
def func3():
    print('=====')
    return
    print('++++++')
    print('--------')
print(func3())

Python的函数只有一个返回值

def func4():
    return 10, 20    # 返回元组(10, 20)
print(func4())

变量的作用域

1.变量的作用域 - 已经定义过的变量能使用范围
根据变量的作用域不同,将变量分为全局变量和局部变量两种
2. 全局变量
没有定义在函数里面或者类里面的变量就是全局变量;
全局变量的作用域:从定义开始到程序结束的任何位置都可以使用

# a、b和x都是全局变量
a = 10
for x in range(5):
    b = 20
    print(f'循环里面a:{a}')
print('循环外面:', x)
def func1():
    print(f'函数里面a:{a}, b:{b}, x:{x}')
  1. 局部变量
    定义在函数里面的变量就是局部变量(形参也是局部变量);
    局部变量的作用域:从定义开始到函数结束
# c和d都是局部变量
def func2(c=3):
    d = 100
    print(f'函数内部c:{c}, d:{d}')

4.函数调用过程就是压栈的过程
调用函数的时候,系统会自动在栈区间为这个函数创建一个临时栈区间,用来保存在函数中产生的数据(局部变量)。
当函数调用结束,这个临时栈区间会自动释放(释放之前会将返回值传递到临时栈区间的外部)。
5.global
在函数中修改一个全局变量的值或者在函数定义一个全局变量
global 变量名
使用变量

num = 30
m = 100
def func3():
    num = 40   # 不是在修改全局变量num的值,而是定义一个新的局部变量
    print(f'函数内部num:{num}')
    global m
    m = 200    # 要函数中修改一个全局变量的值,需要先用global进行说明
    print(f'函数内部m:{m}')

    global n
    n = 'abc'
func3()
print(f'函数外部num:{num}')
print(f'函数外部m:{m}')
print(f'函数外部n:{n}')

作业

  1. 编写一个函数,计算一个整数的各位数的平方和
例如: sum1(12) -> 51的平方加上2的平方)    sum1(123) -> 14
def supplier(num:int):
    '''
    计算一个整数的各位数的平方和
    :param num: 整数
    :return:整数的各位数的平方和sum1
    '''
    sum1 = 0
    for x in str(num):
        sum1 += int(x)**2
    return sum1

print(supplier(123))
  1. 写一个函数,求一个数字列表中绝对值最大的元素
例如:nums = [-23, 100, 89, -56, -234, 123], 最大值是:-234
def max_modulus(list:list):
    '''
    求一个数字列表中绝对值最大的元素
    :param list: 输入的数字列表
    :return:数字列表中绝对值最大的元素max(list1)
    '''
    list1 = []
    for x in list:
        list1.append(abs(x))
    return max(list1)

print(max_modulus([-23, 100, 89, -56, -234, 123]))
  1. 编写函数实现字符串join方法的功能,将指定序列中的元素通过指定字符串合并成一个新的字符串

    def join(list1,str1):
        '''
        将指定序列中的元素通过指定字符串合并成一个新的字符串
        :param list1: 指定序列
        :param str1: 指定字符串
        :return: 新的字符串
        '''
        new_str = ''
        for x in list1[:-1]:
            new_str += str(x) + str1
        new_str += str(list1[-1])
        return new_str
    
    print(join([12, 18, 89,-99,25], '+'))
    
  2. 写一个函数实现列表extend的功能,将指定序列中的元素全部添加到指定列表中

    def extend(list:list,sequence):
        '''
        将指定序列中的元素全部添加到指定列表中
        :param list: 指定列表
        :param sequence: 指定序列
        :return: None
        '''
        for x in sequence:
            list.append(x)
    
  3. 写一个函数实现简易计算器的功能:输入第一个数字,输入运算符,输入第二个数字,计算结果。

    执行过程1:
    计算器:
    >10
    >+
    >20
    =30
    
    执行过程1:
    计算器:
    >10
    >x
    >20
    =200
    
    ....
    
    def calculator(x,operator,y):
        '''
        实现简易计算器的功能:输入第一个数字,输入运算符,输入第二个数字,计算结果。
        :param x: 第一个数字
        :param operator: 运算符
        :param y: 第二个数字
        :return: 计算结果
        '''
        if operator == '+':
            a = (x+y)
            return a
        if operator == '-':
            b=(x-y)
            return b
        if operator == '*':
            c = (x*y)
            return c
        if operator == '/':
            d=(x/y)
            return d
    
    print(calculator(2,'-',7))
    
  4. 已经列表points中保存的是每个点的坐标(坐标是用元组表示的,第一个值是x坐标,第二个值是y坐标)

    points = [
      (10, 20), (0, 100), (20, 30), (-10, 20), (30, -100)
    ]
    

    1)获取列表中y坐标最大的点

    2)获取列表中x坐标最小的点

    3)获取列表中距离原点最远的点

    4)将点按照点到x轴的距离大小从大到小排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值