封装函数系列

本文介绍了Python中的函数封装,包括如何封装打印99乘法表、自定义矩阵打印函数,以及元组、字典、集合、进制转换等基础知识。同时,详细探讨了函数参数的使用,如位置参数、关键字参数、可变参数和关键字可变参数,并展示了函数返回值和多个返回值的处理方式。最后,通过示例讲解了如何判断数字是否为偶数和质数。

“”"
函数:
概念:
一般情况下,某段代码具有一定的功能,可能会被多次复用,封装成函数

封装函数语法:
    def  函数名():
        实现功能的代码

调用:
    函数名()

需求:
封装一个可以使用"*"打印5行8列的矩阵的函数

“”"

list1 = [1,10,2,5]

v = max(list1)

封装了一个可以打印99乘法表的函数

def show99():
for i in range(1, 10):
for j in range(1, i + 1):
print(f’{j} * {i} = {j * i}’, end=’\t’)
print()
show99()
pass
show99()
pass
print(’----’*20)
show99()

“”"
需求:
封装一个可以使用"“打印5行8列的矩阵的函数
封装一个可以使用”
"打印6行10列的矩阵的函数

可以存在同名函数,以最新定义的为准

定义:
def 函数名(形式参数...):
    pass

调用:
    函数名(实际参数...)

实参个数与形参个数一致

“”"
def func1(a,b):
for i in range(a):
for j in range(b):
print(’’,end=’ ‘)
print()
def func2():
for i in range(6):
for j in range(10):
print(’
’,end=’ ')
print()

func1(5,8)
print(’------’*20)
func1(6,10)

func2()

“”"
1.元组
定义:
t = ()
特点:
不可变,有序,可以重复
长度:
len(t)
索引:
同列表
操作:
+连接
*重复
查询:
index()
in
not in
count()

2.字典:
定义:
d = {}
特点:
键值对,无序(没有索引,3.5之后有添加顺序)
key: key唯一,只能是不可变类型,一般情况下使用字符串做key
不可变类型:
数值类型
str
tuple
可变类型:
list,dict,set

操作:
    增
        d[key] = value
        update()
        setdefault()
    删
        pop(key)
        popitem()
        del d[key]
    查(默认查key)
        in
        not in

    改
        d[key] = value
        update()
        setdefault()

    字典中获取元素:
        d[key]
        d.get(key)

3.集合set
定义:
s = set()
s = {1,}
特点:
无序,唯一
可以存储:
跟字典的key一样
只能存储不可变类型

&
    交集
^
    反交集
丨
    并集

4.函数
概念:
拥有一定功能,可能会被多次复用,封装成函数(封装自定义函数)
定义:
def 函数名(形式参数1,…):
实现功能的代码

调用:
    函数名(实际参数1,....)

注意:
    函数在调用时,给的实际参数的个数,取决于函数定义时,形参的个数

    在调用时,对应位置的实参的值,会赋值给形参

“”"

d = {}

d.update(a=1,b=2)

d.update(a=2)

print(d)

def func(a,b):
for i in range(a):
for j in range(b):
print(’*’,end=’ ')
print()
func(5,8)

“”"
进制转换问题:
十进制:
0-9
二进制:
0-1
八进制:
0-7
十六进制:
0-9,A-F

十进制->其他进制
10-2

二进制字符串 =  bin(十进制数字)
'0b'

10-8
八进制字符串 = oct(十进制数字)
‘0o’
10-16
十六进制字符串 = hex(十进制数字)
‘0x’

其他进制转十进制
‘0x45’
int(‘进制字符串’,进制数)

“”"
a = 10
r1 = bin(a) # 0b1010
print(r1)

r2 = oct(a) # 0o12
print(r2)

r3 = hex(a) # 0xa
print(r3)

r4 = int(‘0x45’,16)
print(r4)
print(’–’*20)
r5 = int(‘0xa’,16)
print(r5)
r6 = int(‘0b1010’,2)
print(r6)
r7 = int(‘0o12’,8)
print(r7)

d1 = {‘a’:1}

list1 = [d1,10,2]

del list1[0]

清除字典中的所有数据

d1.clear()
print(d1)

从内存中直接干掉

del d1
print(d1)

“”"
函数定义时:
形参

函数调用时:
实参

形参与实参的关系:
在调用时,实参的个数取决于定义形参的个数
一般情况下,二者的位置,个数,必须一致
特殊情况:
参数位置特殊情况
1.位置参数
2.关键字参数
实参给形参赋值的时候,按关键给的

参数个数特殊情况
    3.默认参数
        def 函数名(形参1=默认值,...):
        如果一个函数在定义时,参数为默认参数,调用时,可给可不给
        如果不给,形参以默认值为准,如果给了,以实参的具体值为准

    4.可变参数
        *args:
            在调用可以给0个,1个,多个,任意类型的参数都是可以的
            args 会当成元组类型来处理,传进来每一个参数都会被当成元组的一个元素

        **kwargs
            要求接受的实参必须是减值对类型的,可以给0,1,多个键值对

“”"

def func1(a,b):

print(f’a = {a},b = {b}’)

func1(5,10)

func1(b=5,a=10)

func1(b=5,10)

func1(10,a=5)

func1(10,a=5,b=20)

list1 = [1,20,3,2]

list2 = sorted(list1,reverse=True)

print(list2)

def func2(a=5,b=10):

print(f’a = {a} b = {b}’)

# func2(10,20)

func2(10)

func2()

可变参数

def func3(*args):

print(type(args))

print(args)

func3()

func3(1)

func3(1,2)

func3(1,2,3)

print(’-------------’)

func3([1,2,3])

def func4(**kwargs):
print(type(kwargs))
print(kwargs)

func4()

不可以给这种类型的参数

func4(1)

只能给减值对类型的参数

func4(a=1)
func4(a=1,b=2)

def func5(*args,**kwargs):

pass

“”"
函数的返回值问题:

return:
1.结束函数
2.用于函数的返回值

注意:
一个函数如果有返回值,接收到的变量,便是对应的返回值类型

如果一个函数没有返回值,则接受到的是None(系统默认返回的)

函数可以存在多个返回值:
如果使用一个变量接收多个返回值,则这个变量默认是tuple类型

也可以使用对应个数的变量接收对应的个数的返回值。

案例:
封装一个可以求两个数字和的函数

def get_sum(a,b):
    return a + b

“”"

v = input(‘请输入:’)

print(v)

v1 = print(‘HelloWorld’)

print(v1)

list1 = [1,10,2,4]

# 自定求列表中最大值的函数

def get_max(list1):

m = list1[0]

for i in range(1,len(list1)):

if m < list1[i]:

m = list1[i]

return m

# return None

v2 = max(list1)

print(f’系统查找最大值:{v2}’)

v3 = get_max(list1)

print(f’自定义查找最大值:{v3}’)

封装一个函数,可以完成一个字典中,键值的反转 {‘a’:1} ===> {1:‘a’}

d1 = {‘a’:1,‘b’:2}

# v = d1.items()

# print(type(v))

def func1(d):

d_new = {}

for k,v in d.items():

# print(k,v)

d_new[v] = k

return d_new

d2 = func1(d1)

print(d2)

函数中是否可以存在多个返回值?

def func2():
return 1,2

v,v1 = func2() # v,v1 = 1,2

v1 = 1,2,3

print(v1)

print(type(v))
print(v)

“”"
需求1: 封装函数,判断一个数字是否为偶数
需求2: 封装函数,判断一个数字是否为质数()

“”"

判断数字n是否为偶数,如果是,返回True,否则,返回False

def is_even_number(n):

if n % 2 == 0:

return True

# print(‘偶数’)

else:

return False

# print(‘不是偶数’)

def is_even_number(n):

return True if n % 2 == 0 else False

def is_even_number(n):
return n % 2 == 0

判断数字n是否为质数

def is_prime_number(n):
# 用来记录数字是否为质数
v = True
for i in range(2,n):
# 判断n是否能被i整除,如果能被整除,说明,不是质数
if n % i == 0:
v = False
break
return v
print(is_prime_number(991))

函数之间的调用

封装一个函数, 打印a,b之间所有的质数

def show_prime_numbers(a,b):
# 逐个判断a-b之间所有的数字
for i in range(a,b+1):
if is_prime_number(i):
print(i)

show_prime_numbers(10,20)

在 Python 中,封装函数是将一系列的代码语句组合在一起,形一个独立的功能模块,通过一个特定的名称来调用。封装函数主要涉及使用 `def` 关键字来定义函数,同时要考虑参数的设置、返回值的处理等方面。 ### 基本定义方法 在 Python 中,使用 `def` 关键字来封装函数,格式为 `def 函数名(参数列表):`,然后在函数体内编写具体的代码逻辑。例如封装一个简单的问候函数: ```python def greet(name): print("Hello, " + name) ``` 这里 `greet` 是函数名,`name` 是参数,函数的功能是打印出问候语 [^3]。 ### 封装函数的层面及接口 封装分为两个层面,无论哪种层面的封装,都要对外界提供好访问内部隐藏内容的接口。接口可理解为入口,使用者只能通过接口访问,不能直接访问内部隐藏细节,并且可以在接口实现上附加更多处理逻辑,以严格控制使用者的访问 [^1]。 ### 装饰器与封装函数 装饰器是为被装饰对象添加新功能的工具,装饰器本身和被装饰的对象都可以是任意可调用对象。装饰器的实现要遵循“开放封闭原则”,即对修改封闭,对扩展开放 [^2]。 ### 封装函数的参数问题 - **有参函数**:定义时有参,调用时也必须有参。 - **默认参数陷阱**:针对可变数据类型的默认参数会出现问题,不可变数据类型不受影响。例如: ```python def c(a=[]): a.append(1) print(a) c() c() c() ``` 结果会不断累加,而如果每次调用时传入新的列表 `c([])`,则不会出现累加情况 [^4]。 ### 其他语言中的封装函数指针示例 在 C89 中可以进行结构体封装函数指针,例如对于不同协议接收 1 字节,加一返回的需求,可以这样实现: ```c #include <stdint.h> uint8_t F_Receive1Byte(uint8_t (*pfun)()) { uint8_t b = (*pfun)(); return b + 1; } uint8_t F_WireLessSwitchBit(void); uint8_t F_WireLessProductBit(void); uint8_t F_WireLess1527Bit(void); // 调用示例 // F_Receive1Byte(F_WireLessSwitchBit); // F_Receive1Byte(F_WireLessProductBit); // F_Receive1Byte(F_WireLess1527Bit); ``` 这里定义了一个接收函数指针的函数 `F_Receive1Byte`,并通过传入不同的函数指针来处理不同的协议 [^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值