Day9 of learning python--函数的定义及参数

1.学习计划安排

数据库:存储数据和信息用的,本质上和文件没有区别,增删改查更方便了。

前端:html。

框架:django,两个月的时间

函数:两周

面向对象和模块:一周

网络编程:一周

并发编程:一周

2.文件的处理

read:一次性读,但是不知道在哪结束;视频,图片用rb按照字节读;

readlines:一行一行全部读,但是会带有转义\n字符

for循环最好,每次读一行,内存只运行一行,比秒内存消耗过大

修改文件:

1)通过r+的模式,先写,后读(但是这种只是能实现inser模式的覆盖)

1 f1 = open('E:\hello.txt',mode='r+',encoding='gbk')
2 f1.seek(8)    # 按照字符的编码单位来计算的,gbk是两个字节代表一个中文字符
3 f1.write('小沛')
4 f1.seek(0)
5 print(f1.read())
6 f1.close()

2)通过‘读写’创建另一文件,然后删除原文件,重命名新的文件,就像真的修改文件一样

1 with open('E:\hello.txt',encoding='gbk') as f1,open('E:\hello.bak.txt',encoding='gbk') as f2:
2     for line in f1:
3         if '杏儿' in line:
4             line = line.replace('杏儿','大哥')
5         f2.write(line)
6 import os
7 os.remove('E:\hello.txt')
8 os.rename('E:\hello.bak.txt','E:\hello.txt')

3.初始函数

1)函数的定义def和调用,定义必须再调用之前,因为函数是按照从上到下执行的,当调用函数的时候,才会执行函数体里面的代码,声明函数的时候,并不会去执行

s = '金老板小护士'
# len(s) 对比函数
def my_len(): # 函数的声明,函数名:字母数字下划线组成,且不能以数字开头
    i = 0
    for k in s:
        i += 1
    # print(i)
    return i  # 返回
print(my_len())  # 调用函数,调用了过后才执行函数体内的代码

2)函数的返回值

#没有返回值,没有return,返回None,只写return:结束一个函数的结束,return None:不常用

1 s = '金老板小护士'
2 def my_len():
3     i = 0
4     for k in s:
5         i += 1
6     # print(i)
7     # return i  # 返回
8 print(my_len())
结果:None
1 s = '金老板小护士'
2 def my_len():
3     i = 0
4     for k in s:
5         i += 1
6     # print(i)
7     return i  # 返回
8 print(my_len())
结果:6

#返回1个值,return xxxx,可以返回任何数据类型,只要返回就可以接收。如果在一个程序中有多个return,只执行第一个return

1 def func():
2     return {'k':'v'}
3     return 1  #不执行
4 print(func())
结果:{‘k':'v'}

   # 返回对个值,多个返回值,多用个变量接收,有多少个返回值就用多少变量接收。用一个变量接收,得到的是一个元组

1 def func2():
2     return 1,2   #相当于 return (1,2),这是python的解包机制,适用于列表,元组,字典
3 r1,r2 = func2()
4 print(r1,r2)
5 r = func2()
6 print(r)
7 结果:1 2
8     (1,2)

4.参数

    形参:

  位置参数:必须传

  *arg:可以接收任意多个位置参数

  默认参数(关键字参数):可以不传

  **kwargs:可以接收多个关键字参数

    实参:按照位置传参,按照关键字传参

def my_sum(a,b):
    res = a + b
    return res

print(my_sum(1,2))     # 按照位置传参
print(my_sum(b=2,a=1))   # 按照关键字传参,可以混乱
print(my_sum(2,a=1))   # 混着用可以,但是先按照位置传参,再按照关键字传参,但是不能给同一变量传多个值,例如这一行代码,运行回显示错误got multiple values for argument 'a'
1 def classmate(name,sex=''):  # 定义函数的时候,位置参数:直接写参数的值;按照关键参数:参数名 = '默认名'
2     print('%s:%s'%(name,sex))  
3 
4 classmate('二哥')          #调用函数事,实参里面没有传的时候,就是按照形参的输出
5 classmate('小梦','')      # 在调用函数的时候,按照位置传:直接写参数的值,按照关键字:关键字 = 值,输出的时候,会替代函数里面的默认值
6 classmate('大猛')

动态参数有两种:可以接收任意个参数

#*args:接收的是按照位置传多个参数的值,组织成一个元组

1 def func(*args):   #站在形参的角度上,给变量加上*,就是组合所有传来的值
2     print(args)
3 
4 func(1,2,3,4,5)
5 l = [1,2,3,4,5]
6 func(*l)   # 站在实参的角度上,给一个序列加上*,就是将这个序列按照顺序打散
7            # 不加*时是一个包含列表的元组
8结果:(1,2,3,4,5)
(1,2,3,4,5)
1 def sum(*args):
2     n = 0
3     for i in args:
4         n += i
5     return n
6 print(sum(1,2,3))
7 print(sum(1,2))

#**kwargs:接收的是按照关键字传参的值,组织成一个字典

1 def func(**kwargs):
2     print(kwargs)
3 
4 func(a=1,b=2,c=3)
5 func(a=1,b=2)
6 func(a=1)
结果:

{'a': 1, 'b': 2, 'c': 3}
{'a': 1, 'b': 2}
{'a': 1}

1 def func(**kwargs):
2     print(kwargs)
3 
4 func(a=1,b=2)
5 d = {'a':1,'b':2}    #按照关键字打散,然后再调用函数时,再一次聚合
6 func(**d)
结果:

{'a': 1, 'b': 2}
{'a': 1, 'b': 2}

5.函数的注释

1 def func():
2     '''
3     这个函数实现了什么功能
4     参数1:
5     参数2:
6     :return: 是字符串或者列表的长度
7     '''
8     pass

备注,行参的编写顺序:位置参数,*args,默认参数,**kwargs

 

posted on 2018-09-13 15:23  smile大豆芽  阅读(127)  评论(0)    收藏  举报