python-04

发布时间 2023-03-27 21:08:26作者: jormen

python函数的定义:函数是组织好的,可重复使用的,用来实现单一,或相关联功能
的代码段

python当中函数分为:内置函数,自定义函数

自定义函数:结合自己的业务场景自定义一个函数来实现场景功能
一个.py文件也叫一个模块

  1. 自定义函数
     def  dcs31():
         print('dcs31 is number one')

    第一种调用方法
     dcs31()                     #  运行结果:dcs31 is number one

    第二种调用方法
     if __name__ == '__main__':        #有个调试代码作用 一个.py文件如果自身在运行,那么他的__name__值等于__mian__,就执行下面代码
         dcs31()

    1.定义一个函数且带单个参数的
    举例1
     def test01(name):
         print('%s去深圳赚钱'%(name))

     test01('小张')
    小张为实际参数,name是形式参数,实际参数传给形式参数,传入的参数只能是一个,如果大于一个或者不传会报错

    2.定义一个函数且带多个参数的
    举例2
     def test01(name,where):
         print('%s去%s赚钱'%(name,where))

     test01('小张','深圳')
    多个形式参数按照顺序传给形式参数,传入的实际参数不能少于也不能多余形式参数,否则报错

    3.定义一个函数且带有默认参数
    举例3
     def test01(name,where='北京'):
         print('%s去%s赚钱' % (name, where))
     test01('小张','深圳')

    当函数带有默认参数值时,调用的时候可以不给默认值参数,默认参数取默认值
    当函数带有默认值参数时,调用的时候可以给默认值参数传入值,输出结果为传入的值,不输出默认值
    注意:默认值参数一定要放在后面,否则报错

    4.定义一个可变长参数的可变长元组
    举例4
     def  test01(*name):
         print(name)
         print(type(name))
     test01('dcs31','baoan31')

    形参中的*会将实参全部接收,然后存储以元组的形式,再把元组赋值给*后面的参数,注意:参数可以为空

    举例4-1
     user_name=('zhangsan','lisi','wanger')
     def  test01(*name):
         print(name)
         print(type(name))
     test01(*user_name)
    传入的实际参数是一个序列时需要加*号

    举例4-2
     user_name=['北京','深圳']
     def test01(name,*where,age=25):
         print(name)
         print(where)
         print(age)
     test01('小程',*user_name,age=30)

    当有位置参数、默认参数、可变长元组时,去调用的时候位置参数一定要在可变长参数前面,默认值可以不传
    当自定义函数同时有位置参数和默认值参数和可变长元组时,同时传参的时候默认值参数需要写参数名=值

    5.定义一个可变长参数中的可变长字典
     dict1={'name':'xiaoliu','age':19}
     dict2={'score':89,'mathroe':90}
     def test01(**num):
         print(num)
     test01(**dict1,**dict2)

    传入多个字典使可变长字典合并为一个字典

     def test01(**num):
         print(num)
     test01(name='xiaohong',age=18,score=87)
    可变长参数字典传入的实际参数可以是一个键值对的形式

 dict1={'name':'xiaoliu','age':19}
 def  test01(*name,**num):
      print(num)
      print(name)
 test01('zhangsan','lisi',**dict1)

可变长元组和可变长字典同时出现,可变长字典需要放在可变长元组后面

=================================================================
6.函数中的变量

6-1、函数中也可以设置变量,在函数中定义变量被称之为局部变量,局部变量只是定义的函数内部有效
6-2、在函数体之外定义变量。我们称之为为全局变量

举例
 num1=200                             #全局变量

 def test1():
     num1=300                         #局部变量
     print(num1+100)
 test1()                             #打印的是局部变量的num1的值  400

 print(num1)                         #打印全局的num1        200

当函数内部变量名是在以一次出现且出现在等号前面,不论全局变量是否用到该变量名,函数都使用函数中的局部变量

举例2
 num1=200
 def test1():
     sum1=num1+100
     print(sum1)
 test1()

当函数内部变量名如果是在等号后面,且第一次出现,则这里引用全局变量

举例3
 num1=200
 def test1():
     global num1
     num1=300
     sum1=num1+100
     print(sum1)
 test1()                       #结果:400
 print(num1)                   #结果:300

在函数中将某个变量定义为全局变量时需要使用关键字global   声明成一个全局变量,原有的全局变量的值会被覆盖

7.python中return 返回值
 def test01():
     num1=200
     score=num1/100
 test01()                          #空没有值
 print(test01())                   #None

 def test01():
     num1 = 200
     score=num1/100
     # print(score)
     return score              #将score的结果返回给到函数调用处,谁调用了这个函数就能拿到score的值
     # print(score)              #一旦函数碰到return就是直接把结果返回去,return后面的代码不会被执行
 test01()
 print(test01())                   #运行结果:2.0

8.函数的传递
编写一个求平均分的函数,然后根据平均分判断是否是一个优秀学生
 def avg():
     num1=600
     score=num1/6
     return score
     # print(score)
 avg()
 def is_good_student():
     values=avg()                   #赋值给到values变量
     # print(values)
     if values>80:
         print('优秀学生')
     else:
         print('不是优秀学生')
 is_good_student()                   #第一种调用

 if __name__ == '__main__':          #第二种调用
     avg()
     is_good_student()

1、需求:登录银行系统并显示余额,有两个功能第一个是登录,第二个是登录后显示余额,先登录然后根据登录是否成功然后是否显示余额。
分析思路:如果想查询到余额,前提必须登录,所以现在我们用两个函数来处理,第一个函数实现登录,第二个函数实现余额查询,调用第一个函数得
到的结果给第二个函数,然后第二个函数根据结果进行代码处理。

2、先定义一个字典存放的用户名和密码,dict1={'amdin':123456,'dcs31':654321}
要求如下:
1-1 :从字典中获取用户完成登入,登入时判断用户是否存在,存在直接登入(密码输入错误时提示密码输入错误请重新输入)
1-2:如果输入的登入用户判断不存在字典中,则调用注册方法,完成注册(注册时输入密码需要确认两次是一致,否则提示两次输入密码不一致请重新输入)
注册成功后写入字典中


 def login():
     name=input('请输入您的账号:')
     if  name=='admin':
         pwd=input('请输入您的密码:')
         if  pwd=='123456':
             return '登录成功'
         else:
             return '密码错误,登录失败'
     else:
        return '用户名错误请重新输入!'

 def test01():
     values=login()
     if  values=='登录成功':
         print('您的余数为100万')
     elif    values=='密码错误,登录失败':
         print('密码错误请重新输入!')
     else:
         print('用户名错误请重新输入')
 if __name__ == '__main__':
     test01()

2.
 dict1={'admin':'123456','dcs31':'654321'}
定义登录函数
 def login():
     username=input('请输入您的用户名:')
     if  dict1.__contains__(username):     #判断输入用户名是否在列表中
         pwd=input('请输入您的密码:')
         if  pwd==dict1[username]:
             print('登录成功')
         else:
             print('您输入的密码有误请重新输入!')
     else:
         print('您输入的账号不存在请注册用户名!')
         register()
 def register():
     newusername=input('请输入您要注册的用户名:')
     if  dict1.__contains__(newusername):
         print('您输入的用户名已存在请重新输入!')
         register()
     else:
         newpwd1=input('请输入您的密码:')
         newpwd2=input('请再次输入密码:')
         if  newpwd1==newpwd2:
             print('注册成功')
             dict1.setdefault(newusername,newpwd2)
             print(dict1)
         else:
             print('两次输入的密码不一致请重新输入!')

 if __name__ == '__main__':
     login()

3.用递归的方法求出n阶乘?  列如:4的阶乘为4*3*2*1(用递归函数:在函数的内部调用函数本身)
 def func(n):
     if  n==0 or n==1:
         return 1
     else:
         return n*func(n-1)                 #调用函数本身

 print(func(5))

9.字符串格式化输出函数format():是一种格式化输出字符串函数,该函数增强了字符串格式化的功能
基本语法:通过{}来代替以前%,{}代表占位符
9-1:举例
 name='lisi'
 where='深圳'
 print('{}去{}'.format(name,where))   #不设置指定位置,按默认顺序

9-2:举例
 name='lisi'
 where='深圳'
 print('{1}去{0}'.format(name,where))               #可以设置指定索引位置输出
 print('{0}{1}去{1}{0}'.format(name,where))    #format函数里面的参数可以通过索引重复取值,运行结果:lisi深圳去深圳lisi

9-3:举例
 name='lisi'
 where='深圳'
 print('{0}去{1}'.format(where,name,'age'))    #fromat函数里面的参数个数可以大于{}占位符个数,取值按照占位符的索引取

9-4:举例
 a='{name}去{where}'.format(name='lisi',where='深圳')   #设置参数输出
 print(a)

9-5:举例
 list1=['lisi','深圳','广州']
 a=('{0[0]}去{0[2]}'.format(list1))     #大括号里面的0代表的列表,中括号里面的0和1代表是列表元素对应的索引
 print(a)                             #lisi去广州

9-6:举例   占位符{}里面必须要丢入参数不然报错
 list1=['lisi','深圳','广州']
 a=('{0}去{0}'.format(list1))     #大括号里面的0代表的列表,中括号里面的0和1代表是列表元素对应的索引
 print(a)                        #运行结果:['lisi', '深圳', '广州']去['lisi', '深圳', '广州']

9-7:举例   同时可以对两个列表进行格式化输出
 list1=['北京','深圳','广州']
 list2=['lisi','zhangsan']
 a=('{1[0]}去{0[1]}'.format(list2,list1))      #输出结果:北京去zhangsan
 print(a)

9-8:举例 对字典进行格式化输出
 dict1={'name':'lisi','where':'深圳'}
 a=('{0[name]}去{0[where]}'.format(dict1))    #0代表就是字典本身,在通过dict1[name]取出该键的值
 print(a)                                    #输出结果:lisi去深圳

9-9:举例  对多个字典机型格式化输出
 dict1={'name':'lisi','where':'深圳'}
 dict2={'name':'zhangsan','where':'广州'}
 a=('{0[name]}去{1[where]}'.format(dict1,dict2))
 print(a)                                      #输出结果:lisi去广州

10.zip函数:用于将可迭代的对象作为参数,将对象中对应的元素打包成一个元组
然后返回有这些元组组成的列表,如果各个迭代器元素个数不一致,则返回列表长度与最短的对象相同
 list1=['北京','深圳','广州']
 list2=['lisi','zhangsan']
 test1=zip(list1,list2)
 test1=list(test1)             #转化列表
 print(test1)                  #结果:[('北京', 'lisi'), ('深圳', 'zhangsan')]
 dict1=dict(test1)             #转化为字典
 print(dict1)                  #{'北京': 'lisi', '深圳': 'zhangsan'}

zip方法在python2和python3的不同点:python3中为减少内存,zip()返回是一个对象,需要展示列表或者字典需要手动转化

11、python中open函数和with open函数
11-1  读模式:r
 file1=open(r'D:\python\dcs31\test','r',encoding='utf8')
 print(file1.read())             #通过file1对象调用read方法读取文件所有内容且字符串形式返回
 print(file1.readline())         #通过file1对象调用readline方法读取文件首行内容且字符串形式返回
 print(file1.readlines())         #通过file1对象调用readlines方法读取文件首行内容且列表形式返回
 a=file1.readlines()
 print(a)                         #['duoceshi\n', 'baoan31']

 print(a[2])                      #取列表的索引值 输出结果:hello
 print(a[1:])                      #切片取列表第二个元素后的所有 输出结果:['baoan31\n', 'hello\n']
 for i in a[1:]:
     print(i,end='')                #baoan31 hello

11-2:写的模式 :w
 file1=open(r'D:\python\dcs31\test','w',encoding='utf8')
 print(file1.write('1宝安31班'))                 #将内容写入到文件里面且会覆盖原有的内容  返回的是字符的个数
 print(file1.write('1'))                         #write接受的参数必须是str,如果是int需要加引号

 file1.close()

11-3: 写的模式(追加):a
 file1=open(r'D:\python\dcs31\test','a',encoding='utf8')
 print(file1.write('hello'))         #在文件内容末尾追加
 print(file1.write('\nhello'))       #再追加的内容前换行
 print(file1.writelines('username'))  #在追加内容返回为一个对象且在内容末尾追加
 file1.close()

11-4:with open 函数,用with open语句好处,就是到达语句末尾时,会自动关闭文件,即便出现异常
 with open(r'D:\python\dcs31\test','r',encoding='utf8') as f:        #取别名为f
    # print(f.read())
    # print(f.readline())
 with open(r'D:\python\dcs31\test', 'a', encoding='utf8') as f:
     print(f.write('duoceshi31'))