python函数

1、函数:

  函数就是一个功能,一个方法,作用简化代码

2、定义一个函数:

  def 函数名():

   函数体

  函数必须得调用才会执行

 

  调用函数:

  函数名()

1 def say():    #定义函数
2     print('这是一个函数')    #函数体
3 
4 say()    #调用函数

3、参数:

  def say(形参):  #形参,形式参数,变量

    print('%s哈哈哈'%name)

  say(实参)    #传进去的值是实参,实际参数

1 def say(name):    #定义函数,有形参
2    print('%s在学习函数'%name)    #函数体
3 say('saki')    #调用函数,传参数

必填参数,位置参数

1 def say(name,sex):    #定义函数,两个形参
2     print('%s在学习函数 sex:%s'%(name,sex))    #函数体
3 x='saki'    #可以定义两个变量
4 y=''
5 say(x,y)    #调用函数,传变量参数

非必填参数,默认值参数,添加默认值,不传就取默认值

1 def say(name,sex=''):    #定义函数,两个形参,给其中一个形参填写默认值
2     print('%s在学习函数 sex:%s'%(name,sex))    #函数体
3 x='saki'    #可以定义两个变量
4 y=''
5 say(x)    #调用函数,传变量参数,只传一个

 4、小练习1:

  写一个计算器,存款有8000元,每个月赚1000元,一共开13个月的工资,现要求把存款和13个月工资加起来。

1 def calc(a,b):   #定义一个函数,定义两个参数
2     res = a*b    #计算13个月总工资 
3     return(res)  #返回res结果
4 cur_money=8000   #存款
5 nx=calc(1000,3)  #年薪
6 calc(nx+cur_money)#年薪+存款

5、return 

  在函数里面的变量全都是局部变量,它只能在函数里面用,函数执行结束那么就没有这个变量了,所以我们需要返回,使用return关键字,调用函数后,返回结果。

  函数在不写return的时候,会返回None。

  函数里面如果碰到return,函数立即结束

1 def my():
2     for i in range(100):
3         print(i)
4         if i==2:
5             return
6 print(my())

结果:0 1 2 None

7、小练习2:

  校验输入的字符串是否是一个合法的小数的程序

  思路:

  ①合法的小数有 正小数,负小数 0.12  -12.3

  ②只有一个小数点,判断小数点个数

  ③正小数的情况下:小数点左边和右边都是整数

  ④负小数的情况下:小数点右边是一个整数,左边必须以负号开头,只有一个负号,并且是整数,使用切片[1:]

 1 def check_float(s):      #定义一个函数,定义一个参数
 2    s=str(s)          #将传进来的值全都改为字符串
 3    if s.count('.')==1:    #判断是否只有一个小数点
 4       s_list=s.split('.')  #只有一个小数的时候,对它进行分割
 5       left=s_list[0]      #取小数点左边的数
 6       right=s_list[1]     #取小数点右边的数
 7       if left.isdigit() and right.isdigit():        #判断如果left和right 都是数字(正小数)
 8          return True
 9       if left.startswith('-') : #判断left是否以负号开头并且是否只有一个负号(负小数)
10          if left[1:].isdigit() and right.isdigit():   #判断left下标1开始到结束是否都是整数,并且判断右边是否都是整数,可以跟上一行写在一起 
11          return True
12    return False
13 print(check_float(-3.5))
14 print(check_float(-50.3))
15 print(check_float('-s.5'))
16 print(check_float('-5.w5w8'))

结果:

  

8、文件操作

1 def my_file(name,content=None):  #定义一个函数,传两个形参,文件名和文件内容
2    with open(name,'a+') as f:    #打开文件,以a+的形式打开
3       f.seek(0)    #将指针移到最前面的位置
4       if content:     #判断content是否传值
5          f.write(content)     #content有内容就将它写进文件
6       else:
7          return f.read()       #如果没有传值,读取文件内容
8 str='aaa'    #定义一个字符串
9 print(my_file('email.txt',str)) #调用函数,传值将内容写入文件,返回None,没传值,读取文件内容

 

 9、FILE_NAME='good.json' 全部大写字母表示常量

10、局部变量和全局变量

    在函数里面定义的变量都是局部变量,除了函数之外的都不能直接使用

    在文件最上面定义的这个变量就是全局变量

 

1 name='小黑'      #定义全局变量
2 def test():      #定义一个函数
3     global name   #声明修改全局变量
4     name='小白'    #修改name的值
5     print(name)    
6 test()          #调用函数

 

11、小练习1

1 money=500                #定义变量money=500
2 def test(consume):        #4、进入该函数
3     return money-consume       #5、money=500减掉consume=500,所以等于0
4 def test1(money):         #2、进入该函数
5     return test(money)+money   #3、调用test(),参数值为500    6、test(money)的值为0+money(500) =500
6 money=test1(money)          #1、首先调用test1()函数,传入money=500
7 print(money)            #7、所以最后结果为500

12、小练习2

  这个练习的结果是什么?

1 def test():
2     global a
3     a=5
4 def test1():
5     c=a+5
6     return c
7 res=test1()
8 print(res)

  

练习的结果报错,提示'a'没有被定义。test()这个函数并没有被调用,a没有被定义,程序找不到a

所以需要调用一下test(),让它把全局变量定义了,正确书写如下:

1 def test():
2     global a
3     a=5
4 def test1():
5     c=a+5
6     return c
7 test()   #调用test()函数
8 res=test1()
9 print(res)

13、小练习3

这个练习的结果是什么?

1 d={'name':'abc'}
2 def my():
3     d['sex']=29
4     print(d)
5 my()
6 print(d)

字典和list,这种可变变量,不需要用global来声明,就可以直接改了

14、可变参数

  可变参数,参数组,参数多的情况下可以使用*args(args为参数名,可修改,一般都使用args)

1 def send_mail(*email):  #参数名前加*号
2     print('email..',email)
3 send_mail('niu@163.com')
4 send_mail('niu@163.com','lxy@qq.com','zyf@126.com')
5 send_mail()

问题:1、是否必填?          非必填

   2、有没有参数个数限制?  没有限制

结果:

1 def run(name,age=29,*args):
2     print(name)
3     print(age)
4     print('args..',args)
5 run('lcx',29,'beijing','tiantongyuan')

结果:

可以看到,给了name的值和age的值,后面两个值没有对应的参数接收,于是全部都归到*args里

15、关键字参数

1 def op_db(ip,port,db,user,passwd,sql):
2     print('链接mysql操作数据库')
3     pass
4 
5 op_db('192.168.1.12',3306,'xxx','ddd','ddd','ddd')#这种必须按照固定位置传参数
6 op_db(db='jxz',ip='192.168.1.1',sql='selecr',port=3306,user='xxx',passwod='aaa') #这时候用到关键传参,不需要按照顺序传参,指定哪个关键字传哪个关键字

16、参数

  参数分为:

    位置参数:必填参数

    默认值参数:非必填参数

    可变参数:非必填参数,不限制参数个数

    关键字参数:非必填参数,将值都放在字典里

  四种参数如果同时使用,必须按照由上到下的顺序进行传值,否则会报错。

17、**kwargs

  **kwargs:两个*号,不限制参数个数,并且将值都放在字典里

1 def my(name,sex='',*args,**kwargs): 
2     print(name)
3     print(sex)
4     print(args)
5     print(kwargs)
6 my('xiaohei','hhh','args','args2',k='1',k2='v2')

18、递归

  递归:函数自己调用自己,递归最多循环999次,超过999次就会报错

1 count=0
2 def add():
3     global count
4     count+=1
5     print('hhh',count)
6     add()
7 add()

用递归的话,必须得有一个明确的结束条件

1 def my2():
2     num=input('输入一个数字:')
3     num=int(num)
4     if num%2!=0:
5         print('请输入偶数')
6         return my2()
7     else:
8         return
9 my2()

19、随机取6个1-33的值,个位数前面补0

方法1:

1 import random
2 res=random.sample(range(1,34),6)#range(1,34) 产生一个从1-33的list,不包括34,random.sample 从一个list里面取几个元素
3 print(res)
4 for i in range(len(res)):
5     res[i]=str(res[i]).zfill(2)
6 print(res)

方法2:

列表推导式,列表生成式

1 import random
2 res=random.sample(range(1,34),6)
3 print(res)
4 res=[str(i).zfill(2) for i in res]
5 print(res)

20、生成1000以内的偶数

1 res=[i for i in range(0,1001,2)]#从0开始到1000,步长为2
2 print(res)

 

posted @ 2018-06-15 17:28  Miyuki蛋卷  阅读(226)  评论(0编辑  收藏  举报