【十】Python 函数

集合:
 list  tuple ---》set()
 无序不重复的序列,集合
 无序 ---》 跟下标相关

 s ={1,2,3,4,5}  ---->s[1]

 for i in s:
    print(i)

内置函数:
添加: add update
删除: remove  discard  pop  clear

运算相关函数:
-  difference()
|  union()
&  intersection()
^  symmetric_difference()

可变和不可变:
可变: 地址不变里面内容改变   list  dict  set
不可变: 只要内容改变,必须改变地址   int  str  float  tuple frozenset

类型转换:
str ---> list  set ...  相互的转换
list ---> set tuple dict  相互的转换

函数:
增加代码的复用性,减少了代码冗余

def 函数名([参数,...]):
    函数体(重复性代码)

没有参数:
def add():
    result = 1+3
    print(result)
调用:
add()   ---> 4

有参数:
def add(a,b):
    result = a+b
    print(result)

调用:
add(1,3)
add(5,6)
add(100,29)

总结:
1.参数的种类:
2.返回值return
3.函数间相互调用
4.局部和全局变量

可变参数

# 有参数的函数:
# 可变参数

# def add(a, b):
#     pass
# add(1,3)

# 定义方式:
# def add(*args):  # arguments 参数
#     # print(args)
#     sum = 0
#     if len(args) > 0:
#         for i in args:
#             sum += i
#         print('累加和是:sum:', sum)
#     else:
#         print('没有元素可计算,sum:', sum)
#
#
# add()  # ()空元组
# add(1)  # (1,)
# add(1, 2)  # (1,2)
# add(1, 2, 3, 4)  # (1,2,3,4)

# xxx 计算出来的累加和是:xxx

def add(name, age, *args):  # name, *args ='飞飞', 4, 6, 8
    # print(args, name)
    sum = 0
    if len(args) > 0:
        for i in args:
            sum += i
        print('%s累加和是:sum:%s' % (name, sum))
    else:
        print('没有元素可计算,sum:', sum)

# 调用
add('飞飞', 4, 6, 8)
add('阿文', 10)  # name,age, *args='阿文',10 #没有元素可计算,sum: 0
add('学强', 9) #没有元素可计算,sum: 0

# a,*b =1,3,5,6,7

# 注意: 可变参数必须放在后面: name,*args

可变参数+关键字参数

# 可变参数 + 关键字参数
# 关键字参数:key=value

def add(a, b=10):  # 关键字参数  此时的b就是默认值
    result = a + b
    print(result)

# 调用
add(5)

add(4, 7)  # a=4,b=7   # 此时7就会覆盖b原来的默认值

def add1(a, b=10, c=4):
    print(a, b, c)
    result = a + b + c
    print(result)

add1(1)
add1(1, 5)  # 是给b赋值成功
# 给c赋值而不是给b赋值
add1(2, 6)  # 默认6是赋值给b了,
add1(2, c=6)  # 如果想将6赋值给c,则需要结合关键字的key使用

# 函数: 打印每位同学姓名和年龄
students = {'001': ('蔡徐坤', 21), '002': ('王源', 19), '003': ('王俊凯', 20), '004': ('易烊千玺', 19)}

def print_boy(name, **persons):  # persons = students
    print('{}喜欢的小鲜肉是:'.format(name))
    if isinstance(persons, dict):
        values = persons.values()
        # print(values)
        for name, age in values:
            print('{}的年龄是:{}'.format(name, age))

# 调用
print_boy('蕊蕊', **students)
# def func(**kwargs):  # key word  argument
#     print(kwargs)

# 调用
# func(a=1, b=2, c=3)  # 关键字参数
# func()  # {}
# func(a=1)  # {'a':1}
# func(a=1, b=2)  # {'a': 1, 'b': 2}
# dict1 = {'001': 'python', '002': 'java', '003': 'c语言', '004': 'go语言'}
# func(**dict1)
'''
步骤:
1.将字典进行拆包。‘001’=‘python’,‘002’=‘java’.......
2.func里面的参数都是关键字
3.将关键字参数在进行一次装包动作
4.装包成功:kwargs,就是装包成功的字典
'''
'''
使用函数的时候:
def aa(**kwargs):
    pass
aa(a=1, b='hello', c='tom')    --->将关键字装包成字典
'''
def aa(**kwargs):
    print(kwargs)

aa(a=1, b='hello', c='tom')  # 装包:{'a': 1, 'b': 'hello', 'c': 'tom'}

# 如果在开发的时候,已知一个字典
dict1 = {'a': 1, 'b': 'hello', 'c': 'tom'}

aa(**dict1)  # a=1, b='hello', c='tom'    
#拆包的过程 
#{'a': 1, 'b': 'hello', 'c': 'tom'}

def bb(a, b, *c, **d):
    print(a, b, c, d)

bb(1, 2)  # 1 2 () {} 后面2个 可有可无
bb(1, 2, 3, 4)  # 1 2 (3,4) {} 没有关键字所以无{}
bb(1, 2, x=100, y=200)  # 1 2 () {'x':100,'y':200} #有关键字出现 *c可有可无
bb(1, 2, 3, x=100)  # 1 2 (3,) {'x':100}
bb(1, 2, x=100, y=200, z=100) #1 2 () {'x': 100, 'y': 200, 'z': 100}

Example&案例

'''
练习:
1.
def func(a,*args):
    print(a,args)

调用:
func(2,3,4,5)      2 (3,4,5)
func(2,[1,2,3,4])  2 ([1,2,3,4],)
func(2,3,[1,2,3,4,5])  2 (3,[1,2,3,4])
func(5,6,(4,5,7),9)  5 (6, (4, 5, 7), 9)

2.
def func(a,b=10,c=3,**kwargs):   关键字默认值
    print(a,b,c,kwargs)

func(1)  1 10  3  {}
func(2,b=10)  2 10 3 {}
func(3,5,7,a=1,b=2)  报错 这里起的名字和函数参数一样 不能重复变量
func(3, c=5, b=7, x=1, y=2)  # 3 5 7 {'x': 1, 'y': 2}

3.
def func(a,*args,**kwargs):
    print(a,args,kwargs)

t=(1,2,3,4)
func(1,t) #1 ((1, 2, 3, 4),) {}

l=[2,5,8]
#func(1,l,a=9,b=6) #报错 和上面函数a 重复
func(1,l,c=9,d=6)  #1 ([2, 5, 8],) {'c': 9, 'd': 6}
'''

# def func(a, *args):
#     print(a, args)
#
#
# func(2, [1, 2, 3, 4],5,'hello')
# func(5,6,(4,5,7),9)


# def func(a, b=10, c=3, **kwargs):
#     print(a, b, c, kwargs)

# func(1)  # 1 10 3 {}
# func(2, b=11)  # 2 11 3 {}
# func(3, c=5, b=7, x=1, y=2)  # 3 5 7 {'x': 1, 'y': 2}

def func(a, *args, **kwargs):
    print(a, args, kwargs)

t = (1, 2, 3, 4)
func(1, t)  # 1 ((1,2,3,4),)

l = [2, 5, 8]
func(1, l, c=9, b=6)  # 1 ([2, 5, 8],) {'c': 9, 'b': 6}

dict1 = {'1': 'a', '2': 'b', '3': 'c'}
func(1, *l, **dict1) 
#这里加个*, 表示把上面的列表给拆了
# func(1,2,5,8,1='a',2='b',3='c')

'''
courses = ['html','mysql','python']
'''
#案例
def technology(name,*args):
	if len(args) >0 :
		for i in args:
			print('{}学过了{}'.format(name,i))
	else:
		print('没有学过任何编程技术')

courses = ['html','PHP','GO','C++']

technology('夏恺晟',courses) #夏恺晟学过了['html', 'PHP', 'GO', 'C++']
technology('夏恺晟',*courses) ## 拆包
# 夏恺晟学过了html
# 夏恺晟学过了PHP
# 夏恺晟学过了GO
# 夏恺晟学过了C++

无参函数&有参函数 总结


'''
无参数函数:

def func():
    pass

func()  ---->调用
  
有参数函数:
  1. 普通参数
  
  def func(name,age):
        pass
  
  func('aa',18)   ----> 形参与实参的个数要一致
    
  2. 可变参数:
   A. def func(*args):
          pass
          
      func()  ----> 函数调用时,实参的个数可以没有,也可以多个   *不能是关键字参数
      func(4)  func(5,'h')
  
  
  B. def  func(**kwargs):
         pass
        
     func(a=1,b=2)  ----> 函数调用时,实参的个数可以没有,也可以多个   **必须是关键字参数

  C. def func(*args,**kwargs):
         pass
    
    list1 = [1,3]
    dict1 = {'1':'a','2':'b'}
    func(*list1,**dict1)  # func(1,3,'1'='a','2'='b')
     
  D. 混用
  
  def func(name,*args,**kwargs):
        pass
        
  func('tom')   ----> 必须赋值

  3. 默认值+关键字  
  def func(name,age=18):
        pass
        
  func('tom')  ----》 tom  18  
  func('tom',age=20)   --->关键字赋值
'''

返回值

# 返回值:将函数中运算的结果通过 return 关键字 ‘扔’出来
def add(a, b):
    result = a + b
    print(result) 
    return 'hello', result

# 调用函数
x, y = add(2, 6)
print(x, y) #
#8
#hello 8
'''
return 返回值
1. return后面可以是一个参数   接收的时候x=add(1,2)
2. return 后面也可以是多个参数, 如果是多个参数则底层会将多个参数先放在一个元组中,
   将元组作为整体返回    x= add(1,2)   x ---> (1,2,3)
3. 接收的时候也可以是多个: return 'hello','world'    x,y = ('hello','world')  ---> x='hello'  y='world'
'''

返回值-案例-加入购物车

'''
 加入购物车
 判断用户是否登录,如果登录,成功加入购物车,否则提示请登录之后添

 成功 True   不成功  False

 def add_shoppingcart(goodsName):
    pass

 def login(username,password):
    pass

  调用
'''

islogin = False  # 用于判断用户是否登录变量  默认是没有登录的


def add_shoppingcart(goodsName):
    if islogin and goodsName:
        # 登录的
        print('成功将{}加入到购物车中!'.format(goodsName))
    else:
        # 没有登录
        print('用户没有登录或者没有添加任何商品!')


def login(username, password):
    if username == 'lijiaqi' and password == '123456':
        # 登录成功
        # print('登录成功')
        return True
    else:
        # print('用户名或者密码有误')
        return False


# 调用函数: 添加商品到购物车中
username = input('输入用户名:')
password = input('输入密码:')

islogin = login(username, password)

add_shoppingcart('阿玛尼唇釉')

函数嵌套

'''
 加入购物车
 判断用户是否登录,如果登录,成功加入购物车,否则提示请登录之后添

 成功 True   不成功  False

 def add_shoppingcart(goodsName):
    pass

 def login(username,password):
    pass

  调用
'''

islogin = False  # 用于判断用户是否登录变量  默认是没有登录的


def add_shoppingcart(goodsName):
    global islogin

    if islogin:
        if goodsName:
            # 登录的
            print('成功将{}加入到购物车中!'.format(goodsName))
        else:
            print('没有选中任何商品!')
    else:
        # 没有登录
        answer = input('用户没有登录!是否登录用户?(yes/no)')
        if answer == 'yes':
            # 登录
            username = input('输入用户名:')
            password = input('输入密码:')

            # 调用login
            islogin = login(username, pa ssword)  # 在一个函数中可以调用另一个函数
            print('islogin:',islogin)

        else:
            print('很遗憾!不能添加任何商品!')

def login(username, password):
    if username == 'lijiaqi' and password == '123456':
        # 登录成功
        # print('登录成功')
        return True
    else:
        # print('用户名或者密码有误')
        return False

# 调用函数: 添加商品到购物车中
username = input('输入用户名:')
password = input('输入密码:')

islogin = login(username, password)

add_shoppingcart('阿玛尼唇釉')

#=================================================
def a():
    print('AAAAAAAAAA')


def b():
    # 调用函数a
    a()
    print('BBBBBBBBBBB')


def c():
    b()
    print('CCCCCCCCCCC')

# 调用b
# b()

c()

 函数综合应用

# 函数综合应用:
'''
 用户登录
 输入用户名
 输入密码
 输入验证码   ----》 封装成一个函数


'''

import random


# 定义生成验证码函数
def generate_checkcode(n):
    s = '0987654321qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
    code = ''
    for i in range(n):
        ran = random.randint(0, len(s) - 1)
        code += s[ran]
    return code


# 定义登录函数
def login():
    username = input('输入用户名:')
    password = input('输入密码:')
    # 得到一个验证码
    code = generate_checkcode(5)  # 函数之间调用
    print('验证码是:', code)
    code1 = input('输入验证码:')
    # 验证
    if code.lower() == code1.lower():
        # 验证码输入正确
        if username == 'lijiaqi' and password == '123456':
            print('用户登录成功')
        else:
            print('用户名或者密码有误!')
    else:
        print('验证码输入有误!')


# 调用函数
login()

 局部变量和全局变量

# global  变量的范围
# 局部变量  全局变量
# 声明在函数外层是全局的,所有函数都可以访问。
name = '月月'

def func():
    # 函数内部声明的变量,局部变量.  局部变量仅限于在函数内部使用
    s = 'abcd'
    s += 'X'
    print(s, name)

# print(s)  报错

def func1():
    global name  # 不修改全局变量,只是获取打印。 但是如果要发生修改全局变量,则需要在函数内部声明:global 变量名
    # print(s)
    print(name)    # 报错: 函数内部的变量可以随便修改赋值,但是全局的变量就不能随便在函数体中进行修改
    name += '会弹吉他'

    print('func1修改后的name是:',name)

def func2():
    name = '小月月'  # 局部变量与全局变量同名
    name += '弹吉他的小美女'
    print(name)

    # global name
    # print(name)

# func2()
# func1()
# func()
func2()
'''
函数
文件操作

异常
模块

面向对象

'''

# 全局变量如果是不可变在函数中进行修改需要添加global关键字,
# 如果全局变量是可变的,在函数中修改的时候就不需要添加global

# 局部和全局
# 全局变量如果是不可变在函数中进行修改需要添加global关键字,
# 如果全局变量是可变的,在函数中修改的时候就不需要添加global
name = '月月'
list1 = [1, 2, 4, 6]

def func():
    name = '蕊蕊'
    print(name)
    print(list1)

def func1():
    global name
    print(name)
    name += '真漂亮!'

    # 修改列表
    list1.append(8)
    print(list1)

def func2():
    name1 = 'lucy'
    name1 += 'hhhh'
    print(name1)  # 自己的

    print(name)

# func1()
#
# func()

func2()

 

posted @ 2023-09-24 22:42  しみずよしだ  阅读(18)  评论(0)    收藏  举报