问题永远是推进进步的源泉
给出以下问题,不使用len()函数,如何获取一个字符串的长度呢?
看到此问题,第一反应就是for循环,由此,我们可以得出如下程序:
str_str = "sdklhaslvbasoehazb"
n = 0
for i in str_str:
n += 1
print(n)
此时,上述问题便得到了的解决,但是如果我还想继续得到另一个字符串的长度时,我们该怎么办呢?
有以下方法得以解决:
str_str = "sdklhaslvbasoehazb"
n = 0
for i in str_str:
n += 1
print(n)
str_str_1 = "fhsa;sanewo"
n_1 = 0
for j in str_str_1:
n_1 += 1
print(n_1)
但是,如果我要得到的字符串数量非常多,该怎么办呢,将所有的字符串都重新抄写一边上述代码吗?
这是,当引入我们这章学习的内容——函数
此时,我们先来使用函数对上述问题进行解决
def get_len(new_str): ##def 为python中的关键字,用于定义函数,get_len为函数名,可以自行定义,new_str为参数,可自行设置数量
n = 0
for i in new_str: #内部为函数的程序,程序运行时不会进行执行,只有在函数被调用时才会执行
n += 1
print(n)
get_len("sdajlfasldkf") #函数名+() 为对函数的执行,()里面的为实参,即函数执行过程中实际使用的量
get_len(str1)
get_len(str2)
get_len(str3)
get_len(str4)
get_len(str5)
get_len(str6)
此时,我们就实现了对字符串求长度的函数写法,使用get_len()调用函数,然后在()中写入想要求取长度的字符串,然后就可以返回函数的结果,即所求字符串的长度
此关键字用于定义一个函数,是定义函数的关键字
此关键字用于返回函数的输出值,并且象征着函数的结束
由上图可知,在函数执行到return时,函数便结束了,因此没有打印出”hello“
def get_hello():
return 0
print("hello")
num = get_hello() #将return的返回值赋值给num变量
print(num) #打印变量num,发现其值为 return的返回值
yield,yield from这两个关键字在后面的生成器中会进行讲解,此处知道有这两个关键字即可
函数的参数即定义函数时,函数名后面()中的参数,意为形参,在执行函数时所传入的参数,是执行函数时,真实进行处理的函数,名为实参。函数的参数又有多种类型
def get_num_square(num):
num = num * num
return num
square = get_num_square(num=9) #使用函数的形参的名字进行传参,即关键字传参
square = get_num_square(10) #当函数中仅有一个参数时,传入值,无需进行多余说明
print(square)
在函数有两个或多个参数时,进行参数传递的过程中,如果直接传参,函数在执行过程中,按照位置来处理传递的参数
def func(num_1,num_2):
print("我是num_1:{}".format(num_1))
print("我是num_2:{}".format(num_2))
func(1,2) #默认第一个传入的参数为num_1,第二个为num_2
def fun(i,j,k,):
print(i)
print(j)
print(k)
fun(1,24,4) #传入参数依然按照位置进行传递
如果仅使用位置进行参数的传递,那么,如果参数的位置记忆错误,那么结果便会与预期大相径庭
def func(name,thing):
print("我是{},{}".format(name,thing))
#正常运行
func("秦始皇","打钱") #我是秦始皇,打钱
#异常运行
func("打钱","秦始皇") #我是打钱,秦始皇
如果只使用关键字进行传参,当关键字忘记时,函数的执行便无从谈起
此时,可进行两者共用进行解决
def func(name,thing,money):
print("我是{},{}!我让你{}".format(name,thing,money))
func("秦始皇",money="当将军",thing="打钱",) #此时可以看到,虽然参数的位置变了,但是结果仍然符合预期
注意:
函数的参数,设置了多少个,就必须传递多少个,多了少了都会时程序无法执行
def add(num_1,num_2):
print(num_1+num_2)
add(10) #传入参数过少,程序无法执行
add(10,20,30) #传入参数过多,程序仍然无法运行
那么有没有办法,使函数不传递参数,也可以运行呢?
有的,此时就需要知道默认参数
def get_square(num=10): #在定义函数时,对形参进行赋值
print(num*num)
get_square() #由于执行函数时,没有传递参数,因此将形参的默认值作为函数的实参进行程序的处理
# 100
在程序开发时,我们可以尽量为函数增加默认参数,以减少程序的报错
此时,参数可以不进行输入,便可以运行程序,那么,有没有办法可以是函数传递多个参数仍然可以运行呢?
答案是肯定的
def add_all(*args):
all = 0
for i in args:
all += i
return all
s = add_all(10,210,121,2,2,1)
print(s)
在函数的形参地方写入*args,表示可以传递多个参数,在函数中使用时,取消*,使用args进行操作,args是一个元组类型,可进行for循环进行处理,将其中的元素全部获取
def add_all(**kwargs):
print(type(kwargs)) #
print(kwargs) #{'name': '蜜雪冰城', 'price': '4', 'count': '10'}
add_all(name="蜜雪冰城",price="4",count="10")
使用**kwargs时,参数传递的格式必须时”类名“=”元素“的形式,传递进函数中的kwargs是一个字典类型,可以使keys方法取得键,values方法取得值,items方法取得键值然后进行for循环进行操作
二者结合使用,可保证程序在传参过程中不会出错,当然,要保证所传入的方法是正确的
以return进行函数的返回,此时返回的数字可以是任何数据类型,然后可进行赋值操作对函数的返回值进行接收,后续可以进行任何符合该数据类型的操作,也可以直接打印查看函数的返回值
def add_all(**kwargs):
return kwargs
s = add_all(name="蜜雪冰城",price="4",count="10")
print(s) #{'name': '蜜雪冰城', 'price': '4', 'count': '10'}
注意:一个函数中可以写入多个return程序不会,报错,仍然可以执行,但是在执行时,函数处理完一个return时,便会停止继续向下执行,因此,在书写函数时,尽量只写一个return。return可以返回多个值,尽量不要书写多个return进行数值的返回,达不到预期的结果
def add_all(**kwargs):
keys_list = kwargs.keys()
new_list = []
for i in keys_list:
new_list.append(i)
num = len(new_list)
return num,new_list #返回键的个数和其具体值
s,list_1 = add_all(name="蜜雪冰城",price="4",count="10") #使用两个变量进行接收,注意接受的形式
print("键的个数为{},其分别为{}".format(s,list_1)) #键的个数为3,其分别为['name', 'price', 'count']