Python基础(7)语法进阶

文章目录

    • 1.引用
    • 2.局部变量
    • 3.全局变量
    • 4.函数不能直接修改全局变量
    • 5.修改全局变量
    • 6.全局变量的位置
    • 7.全局变量命名
    • 8.多个返回值
    • 9.交换数字
    • 10.不可变和可变的参数
    • 11.函数内部通过方法修改可变参数
    • 12.加等于
    • 13.函数的缺省参数
    • 14.函数的缺省参数定义
    • 15.缺省参数的注意点
    • 16.多值参数
    • 17.多值参数求和
    • 18.元组和字典的拆包
    • 19.递归函数的特点
    • 20.递归求和

1.引用

def test(num):

    print("在函数内部 %d 对应的内存地址是 %d" % (num, id(num)))

    # 1> 定义一个字符串变量
    result = "hello"

    print("函数要返回数据的内存地址是 %d" % id(result))

    # 2> 将字符串变量返回,返回的是数据的引用,而不是数据本身
    return result

# 1. 定义一个数字的变量
a = 10

# 数据的地址本质上就是一个数字
print("a 变量保存数据的内存地址是 %d" % id(a))

# 2. 调用 test 函数,本质上传递的是实参保存数据的引用,而不是实参保存的数据!
# 注意:如果函数有返回值,但是没有定义变量接收
# 程序不会报错,但是无法获得返回结果
r = test(a)

print("%s 的内存地址是 %d" % (r, id(r)))

2.局部变量

def demo1():

    # 定义一个局部变量
    # 1> 出生:执行了下方的代码之后,才会被创建
    # 2> 死亡:函数执行完成之后
    num = 10

    print("在demo1函数内部的变量是 %d" % num)


def demo2():

    num = 99

    print("demo2 ==> %d" % num)
    pass

# 在函数内部定义的变量,不能在其他位置使用
# print("%d" % num)

demo1()
demo2()

3.全局变量

# 全局变量
num = 10


def demo1():

    print("demo1 ==> %d" % num)


def demo2():

    print("demo2 ==> %d" % num)


demo1()
demo2()

4.函数不能直接修改全局变量

# 全局变量
num = 10


def demo1():

    # 希望修改全局变量的值
    # 在 python 中,是不允许直接修改全局变量的值
    # 如果使用赋值语句,会在函数内部,定义一个局部变量
    num = 99

    print("demo1 ==> %d" % num)


def demo2():

    print("demo2 ==> %d" % num)


demo1()
demo2()

5.修改全局变量

# 全局变量
num = 10


def demo1():

    # 希望修改全局变量的值 - 使用 global 声明一下变量即可
    # global 关键字会告诉解释器后面的变量是一个全局变量
    # 再使用赋值语句时,就不会创建局部变量
    global num

    num = 99

    print("demo1 ==> %d" % num)


def demo2():

    print("demo2 ==> %d" % num)


demo1()
demo2()

6.全局变量的位置

# 注意:在开发时,应该把模块中的所有全局变量
# 定义在所有函数上方,就可以保证所有的函数
# 都能够正常的访问到每一个全局变量了
num = 10
# 再定义一个全局变量
title = "黑马程序员"
# 再定义一个全局变量
name = "小明"


def demo():

    print("%d" % num)
    print("%s" % title)
    print("%s" % name)

# # 再定义一个全局变量
# title = "黑马程序员"

demo()

# # 再定义一个全局变量
# name = "小明"

7.全局变量命名

gl_num = 10
# 再定义一个全局变量
gl_title = "黑马程序员"
# 再定义一个全局变量
gl_name = "小明"


def demo():

    # 如果局部变量的名字和全局变量的名字相同
    # pycharm会在局部变量下方显示一个灰色的虚线
    num = 99

    print("%d" % num)
    print("%s" % gl_title)
    print("%s" % gl_name)

# # 再定义一个全局变量
# title = "黑马程序员"

demo()

8.多个返回值

def measure():
    """测量温度和湿度"""

    print("测量开始...")
    temp = 39
    wetness = 50
    print("测量结束...")

    # 元组-可以包含多个数据,因此可以使用元组让函数一次返回多个值
    # 如果函数返回的类型是元组,小括号可以省略
    # return (temp, wetness)
    return temp, wetness

# 元组
result = measure()
print(result)

# 需要单独的处理温度或者湿度 - 不方便
print(result[0])
print(result[1])

# 如果函数返回的类型是元组,同时希望单独的处理元组中的元素
# 可以使用多个变量,一次接收函数的返回结果
# 注意:使用多个变量接收结果时,变量的个数应该和元组中元素的个数保持一致
gl_temp, gl_wetness = measure()

print(gl_temp)
print(gl_wetness)

9.交换数字

a = 6
b = 100

# 解法1:-使用其他变量
# c = a
# a = b
# b = c

# 解法2:-不使用其他的变量
# a = a + b
# b = a - b
# a = a - b

# 解法3:-Python 专有
# a, b = (b, a)
# 提示:等号右边是一个元组,只是把小括号省略了
a, b = b, a

print(a)
print(b)

10.不可变和可变的参数

def demo(num, num_list):

    print("函数内部的代码")

    # 在函数内部,针对参数使用赋值语句,不会修改到外部的实参变量
    num = 100
    num_list = [1, 2, 3]

    print(num)
    print(num_list)
    print("函数执行完成")


gl_num = 99
gl_list = [4, 5, 6]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)

11.函数内部通过方法修改可变参数

def demo(num_list):

    print("函数内部的代码")

    # 使用方法修改列表的内容
    num_list.append(9)

    print(num_list)

    print("函数执行完成")


gl_list = [1, 2, 3]
demo(gl_list)
print(gl_list)

12.加等于

def demo(num, num_list):

    print("函数开始")

    # num = num + num
    num += num

    # 列表变量使用 + 不会做相加再赋值的操作 !
    # num_list = num_list + num_list
    # 本质上是在调用列表的 extend 方法
    num_list += num_list
    # num_list.extend(num_list)

    print(num)
    print(num_list)

    print("函数完成")


gl_num = 9
gl_list = [1, 2, 3]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)

13.函数的缺省参数

gl_list = [6, 3, 9]

# 默认按照升序排序 - 可能会多!
# gl_list.sort()

# 如果需要降序排序,需要执行reverse参数
gl_list.sort(reverse=True)

print(gl_list)

14.函数的缺省参数定义

def print_info(name, gender=True):
    """

    :param name: 班上同学的姓名
    :param gender: True 男生 False 女生
    """

    gender_text = "男生"

    if not gender:
        gender_text = "女生"

    print("%s 是 %s" % (name, gender_text))


# 假设班上的同学,男生居多!
# 提示:在指定缺省参数的默认值时,应该使用最常见的值作为默认值!
print_info("小明")
print_info("老王")
print_info("小美", False)

15.缺省参数的注意点

def print_info(name, title="", gender=True):
    """

    :param title: 职位
    :param name: 班上同学的姓名
    :param gender: True 男生 False 女生
    """

    gender_text = "男生"

    if not gender:
        gender_text = "女生"

    print("[%s]%s 是 %s" % (title, name, gender_text))


# 假设班上的同学,男生居多!
# 提示:在指定缺省参数的默认值时,应该使用最常见的值作为默认值!
print_info("小明")
print_info("老王")
print_info("小美", gender=False)

16.多值参数

def demo(num, *nums, **person):

    print(num)
    print(nums)
    print(person)


# demo(1)
demo(1, 2, 3, 4, 5, name="小明", age=18)

17.多值参数求和

def sum_numbers(*args):
# def sum_numbers(args):

    num = 0

    print(args)
    # 循环遍历
    for n in args:
        num += n

    return num

result = sum_numbers(1, 2, 3, 4, 5)
print(result)

18.元组和字典的拆包

def demo(*args, **kwargs):

    print(args)
    print(kwargs)


# 元组变量/字典变量
gl_nums = (1, 2, 3)
gl_dict = {"name": "小明", "age": 18}

# demo(gl_nums, gl_dict)

# 拆包语法,简化元组变量/字典变量的传递
demo(*gl_nums, **gl_dict)

demo(1, 2, 3, name="小明", age=18)

19.递归函数的特点

def sum_number(num):

    print(num)
    # 递归的出口,当参数满足某个条件时,不再执行函数
    if num == 1:
        return 

    # 自己调用自己
    sum_number(num - 1)

sum_number(3)

20.递归求和

# 定义一个函数 sum_numbers
# 能够接收一个 num 的整数参数
# 计算 1 + 2 + ... num 的结果


def sum_numbers(num):

    # 1. 出口
    if num == 1:
        return 1

    # 2. 数字的累加 num + (1...num -1)
    # 假设 sum_numbers 能够正确的处理 1...num - 1
    temp = sum_numbers(num - 1)

    # 两个数字的相加
    return num + temp


result = sum_numbers(100)
print(result)

你可能感兴趣的:(Python基础)