博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PYTHON1.day09
阅读量:6292 次
发布时间:2019-06-22

本文共 14909 字,大约阅读时间需要 49 分钟。

day08 回顾:

   两个容器:
     集合set 和 固定集合 frozenset
       可变        不可变
   集合的创建:
     构造函数:
        set()
        set(range(10)))
     字面值:
        {1, 2, 3, 4}
     集合推导式:
        {x ** 2 for x in range(1, 10)}
   固定集合的创建:
     构造函数:
        frozenset()
        frozenset(range(10))
   集合的运算:
     &交集   |并集   ^对称补集 
     -补集   <子集   >超集    ==相等  !=不等
     <=子集或相等   >= 超集或相等
     in / not in

  集合的方法:

     S.add(x)      增加
     S.remove(x)   删除
     S.discard(x)  删除(但不提示错误)
     S.clear()
     S.pop()       删除随机元素
     S.copy()

  能用容器类的函数

     len(x) min(x) max(x) .....
  
函数 function
   函数是面向过程编程的最小单位

两条语句:

   def 语句
     语法:
       def 函数名(形参变量1, 形参变量2, ....):
           语句块
     作用:
        创建函数, 用函数名绑定这个函数

  调用表达式:

     函数名(实参1, 实参2, ....)

  return 语句

     作用:
       结束当前函数的执行,返回到调用此函数的地方
     格式:
       return [表达式]
    

day09 笔记:
python函数的参数传递(把数据给函数)
   传递方式:
     位置传参
       序列传参
     关键字传参
       字典关键字传参

位置传参:

   实际参数(实参)的对应关系与形式参数(形参)的对应关系是按位置
     来依次对应的
   示意:
     def mymin(a, b, c):
         pass

    mymin(    1, 2, 3)

        
   说明:
     实际参数和形式参数通过位置进行传递和匹配
     实际参数的个数必须与形式参数的个数相同
   示例见:
     positional_give_args.py

   

1 # positional_give_args.py  2   3   4 # 此示例示意位置传参  5 def myfun1(a, b, c):  6     '''这是一个函数传参的示例'''  7     print("a的值是:", a)  8     print("b的值是:", b)  9     print("c的值是:", c) 10  11 myfun1(1, 2, 3)  # 1-->a  2-->b  3-->c 12 myfun1(4, 5, 6) 13  14  15  16
序列传参
   序列传参是指在函数调用过程中,用*将序列拆解后按位置进行传递的
     传参方式

  示例见:

     sequence_give_args.py

1   2   3 # 此示例示意序列传参  4 def myfun1(a, b, c):  5     '''这是一个函数传参的示例'''  6     print("a的值是:", a)  7     print("b的值是:", b)  8     print("c的值是:", c)  9  10 L1 = [11, 22, 33] 11 t2 = (100, 200, 300) 12 s3 = "ABC" 13  14 myfun1(L1[0], L1[1], L1[2])  # L1[0](将11)---> a, L1[1]--->b, ... 15 myfun1(*L1)  # 等同于myfunc(L1[0], L1[1], L1[2]) 16 myfun1(*t2) 17 myfun1(*s3) 18  19  20
   说明:
     序列传参时,序列拆解的位置将与形参一一对应

关键字传参:

   关键字传参是指传参时,按着形参的名称给形参赋值
   实参和形参按名称进行匹配

  示例见:

     keywords_give_args.py

1   2   3 # 此示例示意 关键字 传参  4 def myfun1(a, b, c):  5     '''这是一个函数传参的示例'''  6     print("a的值是:", a)  7     print("b的值是:", b)  8     print("c的值是:", c)  9  10 myfun1(c=33, b=22, a=11) 11 myfun1(b=2, a=1, c=3) 12  13
   说明:
     实参和形参接形参名进行匹配,可以不按位置进行匹配

字典关键字传参:

   是指实参为字典,将字典用**拆解后进行关键字传参的传参方式

  示例见:

     dict_keyword_give_args.py

1   2   3 # 此示例示意 字典关键字 传参  4 def myfun1(a, b, c):  5     '''这是一个函数传参的示例'''  6     print("a的值是:", a)  7     print("b的值是:", b)  8     print("c的值是:", c)  9  10 d1 = {'c': 33, 'a': 11, 'b': 22} 11 myfun1(c=d1['c'], a=d1['a'], b=d1['b'])  # 33--->c , 11--->a ... 12  13 myfun1(**d1)  # 拆解字典,再按关键字传参方式传递 14  15  16
   说明:
     字典的键名和形参名必须一致
     字典的键名必须为符合标识符命名规则的字符串
     字典的键名要在形参中存在
  
练习:
   已知有列表:
     L = [1, 2, True, None, 3.14]
     调用print函数,打印用'#'号分隔的文字信息到终端上
   print(....)  # 打印  1#2#True#None#3.14

1 # 练习:  2 #   已知有列表:  3 #     L = [1, 2, True, None, 3.14]  4 #     调用print函数,打印用'#'号分隔的文字信息到终端上  5 #   print(....)  # 打印  1#2#True#None#3.14  6   7   8   9 L = [1, 2, True, None, 3.14] 10  11 print(*L, sep="#")  # 打印  1#2#True#None#3.14 12 # 等同于print(1, 2, True, None, 3.14, sep='#') 13  14
函数的综合传参:
   1. 函数的传参方式,在能确定形参能唯一匹配到相应实参的情况
     下可以任意组合
   2. 函数的位置传参要先于关键字传参

  示例:

     def myfun1(a, b, c):
         pass
     myfun1(100, c=300, b=200)  # 正确
     myfun1(c=300,b=200, 100)   # 错的
     myfun1(100, *[200, 300])   # 正确
     myfun1(*[100, 200], 300)   # 正确
     myfun1(100, *[200], 300)   # 正确
     myfun1(100, **{'c':300, 'b':200})  # 正确
     myfun1(**{'c':300, 'b':200}, a=100)  # 正确

可变 和不可变类型的容器作为实参传递的区别:

   可变类型的实参作为参数传递时,在函数内部可以改变容器内的数据

  示例见:

     list_as_args.py
     list_as_args2.py

1 # list_as_args.py  2   3 # 此示例示意,当函数的实参为可变数据类型时,在函数内部可以改为  4 # 容器的内容  5   6 L = [1, 2, 3, 4]  7 t = (1.1, 2.2, 3.3, 4.4)  8   9 def append_5(x): 10     # x.append(5) 11     x += (5,) 12     print('x=', x)  # 1.1, 2.2, 3.3, 4.4, 5 13  14 append_5(L) 15 print(L)  # [1, 2, 3, 4, 5] 16  17 append_5(t) 18 print(t)  # (1.1, 2.2, 3.3, 4.4) 19  20  21  22
1
1 # list_as_args2.py  2   3   4 # 写一个函数,此函数读取用户输入的数据,最后保存于全局变量的列表  5 # L中, 当用户输入小于零的数时结束输入  6 L = []  7 def input_number(L1):  8     while True:  9         x = int(input('请输入:')) 10         if x < 0: 11             break 12         L1.append(x) 13  14 input_number(L) 15 print(L) 16 input_number(L) 17 print(L) 18  19  20  21  22  23  24
2

----- 以下讲函数的定义(创建函数的def语句的形参列表)----

函数的缺省参数:
   语法:
     def 函数名(形参名1=默认实参1, 形参名2=默认实参2, ...):
         语句块
   示例见:
     default_args.py

1 # default_args.py  2   3   4 def info(name, age=1, address='不详'):  5     print(name,'今年', age, '岁,家庭住址:', address)  6   7 info("魏明择", 35, '北京市朝阳区')  8 info("tarena", 15)  9 info("小飞") 10
default_args

  说明:

     缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其
     右侧的所有参数都必须有缺省参数,如:
         def test_fn(a, b=10, c):  是错的
     缺省参数可以有0个,1个或多个,甚至全部都有缺省参数
   示例:
     def fn(a, b=10, c):  # 错误
         pass
     def fn(a=0, b=10, c=20):  # 这是对的
         pass

练习:

   写一个函数myadd,此函数可以计算两个数,三个数及四个数的和
     def myadd(...):
         ...
    
     print(myadd(10, 20))  # 30
     print(myadd(100, 200, 300))  # 600
     print(myadd(1, 2, 3, 4))  # 10

1 # 练习:  2 #   写一个函数myadd,此函数可以计算两个数,三个数及四个数的和  3 #     def myadd(...):  4 #         ...  5   6 #     print(myadd(10, 20))  # 30  7 #     print(myadd(100, 200, 300))  # 600  8 #     print(myadd(1, 2, 3, 4))  # 10  9  10  11 def myadd(a, b, c=0, d=0): 12     return a + b + c + d 13  14 print(myadd(10, 20))  # 30 15 print(myadd(100, 200, 300))  # 600 16 print(myadd(1, 2, 3, 4))  # 10 17  18

函数形参的定义方式:
   1. 位置形参
   2. 星号元组形参
   3. 命名关键字形参
   4. 双星号字典形参

位置形参

   语法:
     def 函数名(形参名1, 形参名2, ...):
         语句块

星号元组形参:

   语法:
     def 函数名(*元组形参名):
         语句块
   作用:
     收集多余的位置传参
   说明:
     在一个函数定义中元组形参名最多只能有一个,一般命名为'args'
   示例见:
     star_tuple_args.py

练习:

   写一个函数 mysum 可以传入任意个数字实参,返回所有实参的和
     def mysum(*args):
         ...
    
     print(mysum(1, 2, 3, 4))  # 10
     print(mysum(1, 3, 5, 7, 9))  # 25

1 # 练习:  2 #   写一个函数 mysum 可以传入任意个数字实参,返回所有实参的和  3 #     def mysum(*args):  4 #         ...  5   6 #     print(mysum(1, 2, 3, 4))  # 10  7 #     print(mysum(1, 3, 5, 7, 9))  # 25  8   9  10 # 方法1 11 # def mysum(*args): 12 #     s = 0 13 #     for x in args: 14 #         s += x 15 #     return s 16  17 # 方法2 18 def mysum(*args): 19     return sum(args) 20  21 print(mysum(1, 2, 3, 4))  # 10 22 print(mysum(1, 3, 5, 7, 9))  # 25 23  24
sun
命名关键字形参
   语法:
     def 函数名(*, 命名关键字形参1, 命名关键字形参2, ...):
         语句块
     或
     def 函数名(*args, 命名关键字形参1, 命名关键字形参2, ..):
         语句块
   作用:
     强制所有的参数都必须用关键字传参或字典关键了传参
 
示例见:
     named_keyword_args.py
     named_keyword_args2.py
 
1 # named_keyword_args.py  2   3   4 # 此示例示意在函数形参中定义命名关键字形参,强制让函数调用  5 # 使用命名关键字传参:  6   7 def func1(a, b, *, c, d):  8     print(a, b, c, d)  9  10 # func1(1, 2, 3, 4)  # 报错 11 func1(1, 2, c=30, d=40) 12 func1(a=10, b=20, c=30, d=40) 13  14
1
1 # named_keyword_args.py  2   3   4 # 此示例示意在函数形参中定义命名关键字形参,强制让函数调用  5 # 使用命名关键字传参:  6   7 def func1(a, b, *args, c, d):  8     print(a, b, args, c, d)  9  10 # func1(1, 2, 3, 4)  # 报错 11 func1(1, 2, c=30, d=40) 12 func1(a=10, b=20, c=30, d=40) 13 func1(1, 2, 3, 4, d=400, c=300) 14  15 func1(*"ABCDEFG", **{'c':999, 'd':888}) 16  17  18
2
双星号字典形参
   语法:
     def 函数名(**字典形参名):
         语句块
   作用:
     收集多余的关键字传参
   说明:
     字典形参名一般命名为'kwargs'
     一个函数内字典形参最多只能有一个
   示例见:
     star_dict_args.py
1 # star_dict_args.py  2   3 # 此示例示意用双星号字典形参接收多余的关键字传参  4   5 def func(**kwargs):  6     print("关键字传参的个数是:", len(kwargs))  7     print("kwargs=", kwargs)  8   9 func(name='weimingze', age=35, address='北京市朝阳区') 10 func(a=1, b=2) 11
1
1 # star_tuple_args.py  2   3 # 此示例示意星号元组形参的定义和使用  4   5 def func(*args):  6     print("实参个数是:", len(args))  7     print('args=', args)  8   9 func(1, 2, 3, 4) 10 func(5, 6, 7, 8, 'A', 'B', 'C', 'D') 11 func() 12
2

函数的参数说明:

   位置形参,缺省参数,星号元组形参,双星号字典形参可以混合使用

函数参数自左至右的顺序为:

   1. 位置形参
   2. 星号元组形参
   3. 命名关键字形参
   4. 双星号字典形参

  示例:

     def fn(a, b=20, *args, c=30, d=40, **kwargs):
         pass
     fn(1)
     fn(100, 200, 300, 400, c='C', d='D', e='E')
  
练习:
   已知内建函数max帮助文档为:
     max(...)
         max(iterable) -> value
         max(arg1, arg2, *args) -> value
   仿造 max写一个mymax函数,功能与max完全相同
     (要求不允许调用max)
   测试程序如下:
      print(mymax([6, 8, 3, 5]))  # 8
      print(mymax(100, 200))      # 200
      print(mymax(1, 3, 5, 9, 7)) # 9

1 # 练习:  2 #   已知内建函数max帮助文档为:  3 #     max(...)  4 #         max(iterable) -> value  5 #         max(arg1, arg2, *args) -> value  6 #   仿造 max写一个mymax函数,功能与max完全相同  7 #     (要求不允许调用max)  8 #   测试程序如下:  9 #      print(mymax([6, 8, 3, 5]))  # 8 10 #      print(mymax(100, 200))      # 200 11 #      print(mymax(1, 3, 5, 9, 7)) # 9 12  13  14 # def mymax(a, *args): 15 def mymax(*args): 16     # print("args=", args) 17     if len(args) == 1:  # 判断是否是一个可迭代参数的情况 18         L = args[0]  # 一定绑定一个可迭代对象 19         zuida = L[0]  # 假设第一个元素最大 20         for x in L: 21             if x > zuida: 22                 zuida = x 23         return zuida 24     else:  # 否则有多个参数的情况 25         zuida = args[0] 26         for x in args: 27             if x > zuida: 28                 zuida = x 29         return zuida 30  31  32 print(mymax([6, 8, 3, 5]))  # 8 33 print(mymax(100, 200))      # 200 34 print(mymax(1, 3, 5, 9, 7)) # 9 35  36  37  38
max

1 # 练习:  2 #   已知内建函数max帮助文档为:  3 #     max(...)  4 #         max(iterable) -> value  5 #         max(arg1, arg2, *args) -> value  6 #   仿造 max写一个mymax函数,功能与max完全相同  7 #     (要求不允许调用max)  8 #   测试程序如下:  9 #      print(mymax([6, 8, 3, 5]))  # 8 10 #      print(mymax(100, 200))      # 200 11 #      print(mymax(1, 3, 5, 9, 7)) # 9 12  13  14 def mymax(a, *args): 15     if len(args) == 0:  # 判断是否是一个可迭代参数的情况 16         L = a  # 一定绑定一个可迭代对象 17         zuida = L[0]  # 假设第一个元素最大 18         for x in L: 19             if x > zuida: 20                 zuida = x 21         return zuida 22     else:  # 否则有多个参数的情况 23         zuida = a 24         for x in args: 25             if x > zuida: 26                 zuida = x 27         return zuida 28  29  30 print(mymax([6, 8, 3, 5]))  # 8 31 print(mymax(100, 200))      # 200 32 print(mymax(1, 3, 5, 9, 7)) # 9 33  34  35  36
max2
全局变量 和 局部变量
   局部变量 local varible:
     定义在函数内部的变量称为局部变量(函数的形参也是局部变量)
     局部变量只能在函数内部使用
     局部变量在函数调用时才能够被创建,在函数调用之后会自动销毁
     当有同名的全局变量和局部变量时,优先访问局部变量
   全局变量 global variable:
     定义在函数外部,模块内部的变量称为全局变量
     全局变量,所有函数都可以直接访问(但函数内不能将其直接赋值)

局部变量说明:

   在函数内部赋值语句不会对全局变量造成影响
   局部变量只能在其被声明的函数内部访问,而全局变量可以在整数模
   块范围内访问
示例见:
   global_local.py

1 # global_local.py  2   3 # 此示例示意全局变量的定义和局部变量的定义  4 a = 100  5 b = 200  6 c = 9999999  7 def fx(c):  8     a = 1  # 创建局部变量,并非改变全局变量  9     d = 400 10     print(a, b, c, d) 11  12 fx(300) 13 print('a=', a)  # 100 14 print('b=', b) 15 print('c=', c)

globals 和 locals 函数:

   globals()  返回当前全局作用域内变量的字典
   locals()   返回当前局部作用域内变量的字典

  示例见:

     globals_and_locals.py

1 # globals_and_locals.py  2   3   4 # 此示例示意globals 和 locals函数的使用方法  5 a = 1  6 b = 2  7 c = 3  8 def fn(c, d):  9     e = 300 10     # 此处有多少个局部变量? 11     print("locals()返回:", locals()) 12     # 此处有多少个全局变量? 13     print("globals() 返回:", globals()) 14     print(c)  # 100 15     print(globals()['c'])  # 3 16  17  18 fn(100, 200) 19

练习:
   1. 算出 100 ~ 999 以内的水仙花数(Narcissistic number)
     水仙花数是指百位的3次方加上十位的3次方加上个位的3次方
     等于原数的整数
     例如:  153 = 1**3 + 5**3 + 3**3
     答案:  153, 370, ...

1 #   1. 算出 100 ~ 999 以内的水仙花数(Narcissistic number)  2 #     水仙花数是指百位的3次方加上十位的3次方加上个位的3次方  3 #     等于原数的整数  4 #     例如:  153 = 1**3 + 5**3 + 3**3  5 #     答案:  153, 370, ...  6   7 # 方法1  8 # for x in range(100, 1000):  9 #     # 拆出百位,十位,个位 10 #     bai = x // 100  # 百位 11 #     shi = x % 100 // 10  # 十位 12 #     ge = x % 10  # 个位 13 #     if x == bai ** 3 + shi ** 3 + ge ** 3: 14 #         print(x)  # 满足条件的水仙花数 15  16 # 方法2, 将数字转为字符串 17 # for x in range(100, 1000): 18 #     s = str(x) 19 #     bai = int(s[0]) 20 #     shi = int(s[1]) 21 #     ge = int(s[2]) 22 #     if x == bai ** 3 + shi ** 3 + ge ** 3: 23 #         print(x)  # 满足条件的水仙花数 24  25 # 方法3 26 for bai in range(1, 10): 27     for shi in range(0, 10): 28         for ge in range(10): 29             # print(bai, shi, ge) 30             x = bai * 100 + shi * 10 + ge 31             if x == bai ** 3 + shi ** 3 + ge ** 3: 32                 print(x)

   2. 完全数:
      1 + 2 + 3 = 6 (6为完全数)
      1, 2, 3都为6的因数(能被一个数x整除的数为y,则y为x的因数)
      1 x 6 = 6
      2 x 3 = 6
      完全数是指除自身以外的所有因数之和相加等于自身的数
       求4~5个完全数,并打印
      答案:
        6
        28
        496
        ...

1 #   2. 完全数:  2 #      1 + 2 + 3 = 6 (6为完全数)  3 #      1, 2, 3都为6的因数(能被一个数x整除的数为y,则y为x的因数)  4 #      1 x 6 = 6  5 #      2 x 3 = 6  6 #      完全数是指除自身以外的所有因数之和相加等于自身的数  7 #       求4~5个完全数,并打印  8 #      答案:  9 #        6 10 #        28 11 #        496 12 #        ... 13  14 def is_perfect_number(x): 15     '''此函数判断x是否为完全数,如果是返回True,否则返回False''' 16     L = []  # 创建一个列表,用来存放x所有的因数 17     for i in range(1, x): 18         if x % i == 0:  # 整除了,i则一定是x的因数 19             L.append(i) 20     if sum(L) == x:  # 是完全数 21         return True 22     return False 23  24 def main(): 25     i = 2 26     while True: 27         # 如果i是完全数,则打印i的值 28         if is_perfect_number(i): 29             print(i) 30  31         i += 1 32  33 main() 34
   3. 写一个myrange()函数,参数可以传1~3个,实际意义同range函数
     规则相同,此函数返回符合range(...) 函数规则的列表
     如:
       L = myrange(4)
       print(L)  # [0, 1, 2, 3]
       L = myrange(4, 6)
       print(L)  # [4, 5]
       L = myrange(1, 10, 3)
       print(L)  # [1, 4, 7]

1 #   3. 写一个myrange()函数,参数可以传1~3个,实际意义同range函数  2 #     规则相同,此函数返回符合range(...) 函数规则的列表  3 #     如:  4 #       L = myrange(4)  5 #       print(L)  # [0, 1, 2, 3]  6 #       L = myrange(4, 6)  7 #       print(L)  # [4, 5]  8 #       L = myrange(1, 10, 3)  9 #       print(L)  # [1, 4, 7] 10  11  12 def myrange(start, stop=None, step=None): 13     if stop is None:  # if not stop: 14         stop = start 15         start = 0 16     if step is None: 17         step = 1 18     # 开始,结束和步长都已确定 19     # return [x for x in range(start, stop, step)] 20     if step > 0:  # 正向 21         L = [] 22         while start < stop: 23             L.append(start) 24             start += step 25         return L 26     elif step < 0: 27         L = [] 28         while start > stop: 29             L.append(start) 30             start += step 31         return L 32  33 L = myrange(4) 34 print(L)  # [0, 1, 2, 3] 35 L = myrange(4, 6) 36 print(L)  # [4, 5] 37 L = myrange(1, 10, 3) 38 print(L)  # [1, 4, 7] 39  40 L2 = myrange(10, 0, -2) 41 print(L2) 42  43  44
1   2 #   3. 改写之前的学生信息管理程序:  3 #     用两个函数来封装功能的代码块  4 #        函数1:  input_student()   # 返回学生信息字典的列表  5 #        函数2:  output_student(L)  # 打印学生信息的表格  6   7 def input_student():  8     L = []  # 创建一个列表,准备存放学生数据的字典  9     while True: 10         n = input("请输入姓名: ") 11         if not n:  # 如果用户输入空字符串就结束输入 12             break 13         a = int(input("请输入年龄: ")) 14         s = int(input("请输入成绩: ")) 15         d = {}  # 一定要每次都创建一个新的字典 16         d['name'] = n 17         d['age'] = a 18         d['score'] = s 19         L.append(d)   # 把d加入列表中L 20     return L 21  22 def output_student(L): 23     print("+---------------+----------+----------+") 24     print("|     姓名      |   年龄   |   成绩   |") 25     print("+---------------+----------+----------+") 26     for d in L: 27         name = d['name'] 28         age = str(d['age'])  # 转为字符串 29         score = str(d['score'])  # 转为字符串 30         print("|%s|%s|%s|" % (name.center(15), 31                             age.center(10), 32                             score.center(10))) 33     print("+---------------+----------+----------+") 34  35  36 # infos = input_student() 37 # print(infos)  # 打印列表[{...}, {...}] 38 # output_student(infos)   # 根据实参infos打印表格 39  40 def main(): 41     infos = []  # 此列表用于保存学生数据 42     while True: 43         print(" 1) 添加学生信息") 44         print(" 2) 显示学生信息") 45         print(" q) 退出") 46         s = input("请选择: ") 47         if s == '1': 48             infos += input_student() 49         elif s == '2': 50             output_student(infos) 51         elif s == 'q': 52             break 53  54  55 main() 56
student

转载于:https://www.cnblogs.com/shengjia/p/10311202.html

你可能感兴趣的文章
为网页添加留言功能
查看>>
JavaScript—数组(17)
查看>>
Android 密钥保护和 C/S 网络传输安全理论指南
查看>>
以太坊ERC20代币合约优化版
查看>>
Why I Began
查看>>
同一台电脑上Windows 7和Ubuntu 14.04的CPU温度和GPU温度对比
查看>>
js数组的操作
查看>>
springmvc Could not write content: No serializer
查看>>
Python系语言发展综述
查看>>
新手 开博
查看>>
借助开源工具高效完成Java应用的运行分析
查看>>
163 yum
查看>>
第三章:Shiro的配置——深入浅出学Shiro细粒度权限开发框架
查看>>
80后创业的经验谈(转,朴实但实用!推荐)
查看>>
让Windows图片查看器和windows资源管理器显示WebP格式
查看>>
我的友情链接
查看>>
vim使用点滴
查看>>
embedded linux学习中几个需要明确的概念
查看>>
mysql常用语法
查看>>
Morris ajax
查看>>