首页 文章 精选 留言 我的

精选列表

搜索[全栈工程师],共10004篇文章
优秀的个人博客,低调大师

Python全栈工程师(函数的传参)

ParisGabriel 感谢 大家的支持 每天坚持 一天一篇 点个订阅吧灰常感谢 当个死粉也阔以 Python人工智能从入门到精通 “\n”Linux 换行符"\r\n" Windows换行符 函数的参数传递: 传参方式:(2种) 位置传参(包含关系 ) 序列传参 关键字传参(包含关系) 字典关键字传参位置传参: 实际参数(实参)的对应关系与形式参数(形参) 的对应关系是安位置来依次对应的 说明: 实参和形参通过位置进行传递和匹配 实参的个数必须与形参的个数相同序列传参: 序列传参是指在函数调用过程中,用 * 将序列拆解 后按照位置进行传递的方式 说明: 序列传参时,序列拆解的位置与形参一一对应 序列的位置信息对应相应的形参的位置关键字传参: 关键字传参是指传参时,按着形参的名称给形参赋值、实参和形参按形参名进行匹配 字典关键字传参: 是指字典,将字典用“**”拆解后再进行关键字传参的方式 说明: 字典的键名必须和形参名一致 字典的键名必须是字符串且标识符 字典额键名要在形参中存在综合传参: 函数的传参方式在能确定形参能唯一匹配到相应实参的情况下可以任意组合 说明: 位置传参(序列传参)一定要在关键字传参(字典关键字传参)的左侧 示例: def fu(a, b, c): print("a=", a) print("b=", b) print("c=", c) fu(100, *[200, 300]) fu(*[100, 200], 300) fu(100, 200, 300) fu(100, b=200, c=300) fu(100, **{"c": 200, "b": 300}) --------------------函数的形参定义--------------------函数的缺省参数: 语法: def 函数名 (形参名1=默认实参1, 形参2=默认实参2) 语句块 说明: 缺省参数必须从右至左依次存在的,如果一个参数有缺省参数, 则右侧的所有参数都必须有缺省参数函数的形参定义: 1.位置形参 2.星号元组形参 3.命名关键字形参 4.双星号字典形参 位置形参: 语法: def 函数名(形参1, 形参2.......) 语句块 元组形参: 语法: def 函数名(*元组形参名): 语句块 作用: 收集多余的位置传参 命名关键字形参: 语法: def 函数名(*, 命名关键字形参): 语句块 或 def 函数名(*args, 命名关键字形参): 语句块 (关键字形参 必须用关键字传参) 作用: 强制所有的参数都参数都必须用关键字传参或字典关键字传参双星号字典传参: 语法: def 函数名(**字典形参名): 语句块 作用: 收集多余关键字传参 字典形参名通常命名为:kwargs函数的参数说明: 位置形参、星号元组形参、命名关键字形参、双星号字典形参可以混合使用函数自左到右的顺序为: 1.位置形参 2.星号元组形参 3.命名关键字形参 4.双星号字典形参 例如: def fx(a, b, *args, c, **kwargs): pass fx(100, 200, 300, 400, c="c", d="d")函数的不定长参数: 星号元组形参,双星号字典形参 说明: 可以接收任意位置传参和关键字传参 例如: def fn(*args, **kwargs) pass全局变量和局部变量: 局部变量:local variable 1.定义函数内的变量成为局部变量(函数的形参也是局部变量) 2.局部变量只能在函数内部使用 3.局部变量在函数调用时才能够被创建,在函数调用之后被销毁 全局变量:global variable 定义在函数外,模块内的变量称为全局变量 全局变量所有函数都可以直接访问(但函数内不能将其直接赋值) 练习: 1.写一个函数minmax(a, b, c) 有三个参数,这回这三个参数中的最小值和最大值, 要求,形成元组,最小值在前,最大值在后,如: def minmax(a, b, c): ... t = minmax(11, 33, 22) print(t) # (11, 33) # <<< 打印元组 xiao, da = minmax(6, 5, 4) print('最小值:', xiao, '最大值:', da) 答案: def minmax(a, b, c): x = a if x > b: x = b if x > c: x = c z = a if z < b: z = b if z < c: z = c L = [x, z] print(L) minmax(2, 1, 3)方法二: def minmax(a, b, c): L = [min(a, b, c), max(a, b, c)] print(L) minmax(2, 3, 1) 其实方法二 这样也是可以的不过就是有点不厚道了 这不属于二道贩子嘛 2.写一个函数 myadd, 此函数可以计算两个数的和,也可以计算三个数的和 def myadd(......): .... print(myadd(10, 20)) # 30 print(myadd(100, 200, 300)) # 600 答案: def myadd(a, b, c=0): return a + b + c print(myadd(100, 200, 300)) print(myadd(100, 200)) def mysum(*args): return sum(args) 皮一下很开心 mysum = sum 3 . 写一个函数,print_odd, 此函数可以传递一个实参,也可以传递两个实参,当传递一个实参时代表结束值 当传递两个实参时,第一个实参代表起始值,第二个实参代表结束值 打印出以此区间内的全部奇数,不包含结束数: print_odd(10) # 1 3 5 7 9 print_odd(11, 20) # 11 13 15 17 19 答案: def print_odd(a, b=None): if b == None: b = a a = 0 for x in range(a, b): if x % 2 != 0: print(x, end=" ") print_odd(10)# 1 3 5 7 9 print_odd(11, 20)# 11 13 15 17 19 4. 写一个函数, mysum可以传入任意个实参的数字,返回所有实参的和 def mysum(*args): ... print(mysum(1, 2, 3, 4)) # 10 print(mysum(10, 20, 30)) # 60 答案: def mysum(*args): i = 0 for x in args: i += x return i print(mysum(1, 2, 3, 4)) # 10 print(mysum(10, 20, 30)) # 60 6. 创建一个全局变量 L = [] 写一个函数: def input_number(): .... 此函数每次调用将从键盘读入一些数字追加到列表L中 如: L = [] def input_number(): .... input_number() print(L) # [ .... 这些是您从键盘输入的数..] L = [] def input_number(): while True: a = int(input("please input (-1 over):")) if a < 0: break L.append(a) return L L = input_number() print(L) # [ .... 这些是您从键盘输入的数..] 7. 写一个函数isprime(x) 判断x是否为素数。如果是素数,返回True,否则返回False 答案: def isprime(x): if x > 2: for i in range(2, x): if x % i == 0: s = False break else: s = True else: if 1 < x < 3: s = True else: s = False return s x = isprime(4) print(x) 8. 写一个函数prime_m2n(m, n) 返回从m开始,到n结束(不包含n)范围内的素数,返回这些素数的列表并打印 如: L = prime_m2n(5, 10) print(L) [5, 7] 答案: def prime_m2n(m, n): L = [] for x in range(m, n): if isprime(x) == True: L.append(x) return L L = prime_m2n(5, 10) print(L) 9. 写一个函数pimes(n) 返回小于n的全部素数的列表,并打印这些素数 如: L = primes(10) print(L) # [2, 3, 5, 7] 1) 打印100 以内的全部素数 2) 打印200 以内的全部素数的和 答案: def pinmes(n): return prime_m2n(1, n) L = pinmes(10) print(L) # [2, 3, 5, 7] print(pinmes(100)) print(sum(pinmes(200))) 10. 编写函数 fn(n) 此函数返回下列级数的和: fn(n) = 1/(1*2) + 1/(2*3) + .... + 1/(n*(n-1)) 的和 print(fn(100)) 答案: def fn(n): s = 0 for i in range(1, n): s += 1 / (i * (i + 1)) return s print(fn(100)) 一波经验加成buff: (咳咳 C波牛B) 开局 一人 一电脑 ,一键盘999999999999999级你肯会迷茫 晕眩 摸不着头尾 没关系 给你加个经验值BUFF 因为很多专业术语比较抽象 再加上翻译差别 所以说很多人都是知道专业术语该怎么说叫什么 一般容易记住和记忆最久的应该就是用自己的方式去跟现实或者一些列子对比越白话文越好记 什么花里胡哨的术语 知道是什么就行了 (能记还是要记得 说也尽量说 只是在你脑子里是一个对应的实例关系 就好比 变量 在内存中.......跑题了 溜了 溜了) 实参、传参、形参是什么 ? 实参就是调用函数时的参数 传参就是把形参传给实参的过程 形参就是定义(封装)函数时的参数字典关键字传参就是把字典先用(**)拆开分成形参和实参 键代表关键字(形参、不可变) 值代表参数(实参、可变) 一个键对应一个值 一个关键字对应一个参数 列表、元组 都是属于顺序传参 先用(*)拆分后传参 关键字传参必须有关键字(形参)和参数(实参)传参的排序规则: 从左到右 1.位置形参 2.星号元组形参 3.命名关键字形参 4.双星号字典形参 变量没什么可说的 就相当于一个公共电话(全局)和私人手机(局部) 所有人都可以用公共电话 你的私人手机你会让所有人用吗?我想不会吧

优秀的个人博客,低调大师

Python全栈工程师(字符串/序列)

ParisGabriel Python 入门基础 字符串:str用来记录文本信息字符串的表示方式:在非注释中凡是用引号括起来的部分都是字符串‘’ 单引号“” 双引号''' ''' 三单引""" """ 三双引有内容代表非空字符串否则是空字符串 区别:单引号内的双引号不算结束符双引号内的单引号不算结束符三引号内的换行会自动转换为换行符三引号内可以包含单引号和双引号 隐式字符串拼接: s = "I'm a I'm a programmer" 'heoll "wored"' 转移符:\' 单引号\" 双引号\\ 单反斜杠\n 换行\r 返回光标至行首\t 水平制表符\v 垂直制表符\f 换页\b 倒退\0 空字符,字符值为0\xXX ,XX为两位16进制表示的自符\uXXXX ,XXXX为4个16进制的Unicode16字符\UXXXXXXXX ,8个16进制表示的Unicode32字符 ASCII编码:man ASCII:查看帮助文档命令 常用ASCII编码:字符 十进制 十六进制 0 48 0x30 A 65 0x41 a 97 0x61 Unicode:统一编码,分为Unicode16、Unicode32 序列的概念:字符串就是序列函数:len(x) 返回字符串的字符个数raw 字符串:让转义符号\无效格式:r‘字符串内容’print(r“\n\\\t”)字符串的运算:+ 用于拼接字符串* 用于生成重复字符串字符串的相乘只能与整数+= *= 与其他符合运算符相同in / not in 运算符:用于判断某个字符串是否在相当于字符串出现过 如果出现过返回true 否则返回false字符串的比较运算:> >= < <= == != 依次按照编码进行比较,直到最短字符串结束为止 索引(下标):Python的字符串是不可以改变字符序列的 index:字符串[整数表达式]Python序列都可以用索引来访问序列中的对象Python的序列正向索引是冲0开始的最后一个索引为len(s)-1Python序列的反响索引是从-1开始的 -1是最后一个 第一个是 -len(s) 切片:slice从一个字符串序列中取出相应的元素重新组成一个字符串系列语法:字符串序列[(开始索引b):(结束索引e):(步长s)]小括号括起的部分代表可省略说明:开始索引是切片开始切下的位置,0代表第一个元素,1代表第二个,-1代表最后一个结束索引是切片的终止索引(但不包括终止点)步长:是切片每次获取当前元素后移动的方向和偏移量没有步长,相当于取值完成后向右移动一个索引的位置默认1当步长代表为正数时取正向切片 步长默认为1 开始位置为0 结束为len(s)步长代表下一次索引的取值增长值当步长为负数时 取反向切片 默认的起始位置是最后一个元素,终止位置是第一个元素的前一个位置 Python3中常用于序列函数:len(x)返回序列长度 max(x)返回序列最大值元素 min(x)返回序列最小止元素 字符串编码转换函数:ord(c)返回一个字符的Unicode值(十进制) chr(i)返回 i这个整数的值所对应的字符 整数转字符串函数:bin(i) 将整数转换为二进制的字符串 oct(i) 将整数转换为八进制的字符串 hex(i) 将整数转换为十六进制的字符串 二进制转换其他进制是非常好转的 如图: 100=4 101=5 10=2 156=0o452 (八进制) 1100=c 1001=9 156=0x9c (十六进制) 字符串的构造函数:str(obj=“”) 将对象转换为字符串 常用的字符串方法:文档参见:对象.方法名(方法传参)"abc".isalpha() # 语法是对的123.isalpha() # 语法是错的方法 说明S.isdigit() 判断字符串中的字符是否全为数字S.isalpha() 判断字符串是否全为英文字母S.islower() 判断字符串所有字符是否全为小写英文字母S.isupper() 判断字符串所有字符是否全为大写英文字母S.isspace() 判断字符串是否全为空白字符S.center(width[,fill]) 将原字符串居中,左右默认填充空格 width:所居中字符串的长度 fill:默认填充空格 S.count(sub[, start[,end]]) 获取一个字符串中子串的个数 sub:所要获取的字符串 start:起始位置 end:结束位置S.find(sub[, start[,end]]) 获取字符串中子串sub的索引,失败返回-1 start:起始位置 end:结束位置 S.strip() 返回去掉左右空白字符的字符串S.lstrip() 返回去掉左侧空白字符的字符串S.rstrip() 返回去掉右侧空白字符的字符串S.upper() 生成将英文转换为大写的字符串S.lower() 生成将英文转换为小写的字符串S.replace(old, new[, count]) 将原字符串的old用new代替,生成一个新的字符串 count:更换的次数S.startswith(prefix[, start[, end]]) 返回S是否是以prefix开头,如果以prefix开头返回True,否则返回False,S.endswith(suffix[, start[, end]]) 返回S是否是以suffix结尾,如果以suffix结尾返回True,否则返回False 以下是不常用的 S.title() 生成每个英文单词的首字母大写字符串S.isnumeric() 判断字符串是否全为数字字符 练习:1.输入一个字符串用s绑定判断输入有几个人空格将原字符串的左右空格空白符去掉打印剩余的字符个数判断输入的是否是数字如果是数字判断这个数是否大于100 答案: print("Answer to question 1:", "\n") s = input("plaese input at will string:") print("you input string blank have ", s.count(" ")) print("string surplus:", len(s.strip())) if s.isdigit() is True: if int(s) > 100: print("input integer:", s, ">100") else: print("input integer:", s, "<100") else: print("you input contain alpha:", s) 2.输入3行文字,让这三行文字在一个方框内居中显示显示如下:+---------------+| hello || 123123 || |+---------------+注:请不要输入中文 答案: print("Answer to question 2:", "\n") a = input("plaese input at will string 1:") b = input("plaese input at will string 2:") c = input("plaese input at will string 3:") top = a if top < b: top = b if top < c: top = c print("+" + "-" * (len(top) * 2 + 10) + "+") print("|" + a.center(len(top) * 2 + 10) + "|") print("|" + b.center(len(top) * 2 + 10) + "|") print("|" + c.center(len(top) * 2 + 10) + "|") print("+" + "-" * (len(top) * 2 + 10) + "+")

优秀的个人博客,低调大师

Python全栈工程师 (类变量、方法、继承、覆盖)

ParisGabriel 每天坚持手写一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python人工智能从入门到精通 补充: 实例方法都是操作实例对象的 属于此类对象的方法 实例变量 添加/修改属性: 对象.属性名 = 表达式 删除: del 对象.属性名 类 | 对象 | 实例 class object instance 类的本质上也是对象 类可以创建此类对象 ----------------------------------------------------------------------------------------------------------------- 类: 类变量: 类变量是类的属性, 此属性属于类, 不属于此类的实例 作用: 通常用来储存该类创建的对象的共同属性 说明: 类变量可以通过该类的实例直接访问 类变量可以通过类的实例间接访问 类变量可以通过此类的对象__class__属性间接访问示例: # -*- coding:utf-8 -*- # 类变量 class Human: total_count = 0 # 类变量 def __init__(self, name): print(name, '对象被创建') print(Human.total_count) # 0 h1 = Human("zhang") print(h1.total_count) # 0 用此类实例访问类变量 h1.total_count = 100 # 为对象添加实例变量 print(h1.total_count) # 100 优先访问实例变量 print(Human.total_count) # 0 访问类变量 class Human: total_count = 0 # 类变量 def __init__(self, name): print(name, '对象被创建') h1 = Human("zhang") print(Human.total_count) # 0 h1.__class__.total_count = 100 # 为类添加修改实例变量 print(h1.total_count) # 100 间接访问类变量 print(Human.total_count) # 100 访问类变量 # 类变量的应用 用类变量记录实例个数 class Human: total_count = 0 # 类变量 def __init__(self, name): print(name, '对象被创建') self.__class__.total_count += 1 # 每次创建对象调用__init__ 类变量加1 def __del__(self): self.__class__.total_count += 1 # 每次析构对象后类变量减1 h1 = Human("zhang") print("此时Human对象的个数是", Human.total_count) # 1 L = [] L.append(Human("li")) L.append(Human("zhao")) print("此时Human对象的个数是", Human.total_count) # 3 del h1 L.pop() print("此时Human对象的个数是", Human.total_count) # 1 类的文档字符串: 和函数等一样 用__doc__属性访问示例: >>> class Dog: ... '''这是小动物''' ... >>> help(Dog) >>> Dog.__doc__ '这是小动物' >>> 类 __slots__ 列表: 作用: 限定一个类的创建实例只能有固定的属性(实例变量) 不允许对象添加列表以外的属性(实例变量) 防止用户因错写属性的名称而发生错误 说明: 1.__slots__ 列表绑定一个字符串列表 2.含有__slots__列表的类所创建的实例对象没有__dict__属性 (不用字典储存对象的属性 __slots__限制) 示例: class Human: # 以下列表限制此类对象只能有这两个属性 防止出错 __slots__ = ["name", "age"] def __init__(self, name, age): self.name, self.age = name, age h1 = Human("Ta", 15) print(h1.age) # 15 h1.Age = 18 # 区分大小写 出错 没有Age属性,也不允许有 print(h1.age) # 15 类方法 @ classmethod 类方法是用于描述类的行为的方法 类方法属于类, 不属于类的实例 说明: 类方法需要使用 @classmethod装饰器定义 类方法至少有一个形参, 第一个形参用于绑定类, 约定写“cls” 类和该类的实例都可以调用类的方法 类方法不能访问此类创建的实例的属性示例: # 类方法的使用 class A: v = 0 @classmethod def get_v(cls): # cls 用来绑定调用此方法的类 return cls.v # 访问类变量 @classmethod def set_v(cls, value): cls.v = value print(A.get_v()) # 0 A.set_v(100) print(A.get_v()) # 100 a1 = A() # 创建实例 print("a1.get_v=", a1.get_v) # 100 a1.set_v(200) print("a1.get_v=", a1.get_v) # 200 print("A.get_v=", A.get_v) # 200 静态方法 @staticmethod 静态方法是定义在类内部的函数, 此函数的作用域是类的内部 说明: 静态方法需要使用 @staticmethod装饰器定义 静态方法与普通函数定义相同, 不需要传入self实例参数和cls参数 静态方法只能凭借该类的创建实例调用 静态方法不能访问变量和实例变量(属性)示例: # 静态方法 class A: @staticmethod def myadd(a, b): return a + b print(A.myadd(100, 200)) # 300 a = A() # 创建实例 print(a.myadd(300, 400)) # 700 # def myadd(a, b): # 和静态方法结果一样 # return a + b # class A: # pass # print(A.myadd(100, 200)) # 300 # a = A() # 创建实例 # print(a.myadd(300, 400)) # 700 实例方法, 类方法, 静态方法,函数, 小结: 1.不想访问 类内 的和 实例内 的变量, 用静态方法 2.只想访问类变量, 不想访问实例变量, 用类方法 3.既要访问类变量, 也想访问实例变量, 用实例方法 4.函数与静态方法相同, 只是静态方式的作用域定义在类内 继承inheritance/派生derive: 什么是继承/派生: 继承是从已有的类中派生出新的类, 新类具有原类的行为, 并能扩充新的行为 派生是从已有的类中衍生成新类, 在新类上可以添加新的属性和行为 作用: 用继承派生机制, 可以将一些共有的功能加在基类中, 实现代码的共享 在不改变基类的代码的基础上改变原有的功能 名词: 基类(base class) / 超类(super class)/父类(father class) 派生类(derived class)/子类(child class) 子类对象一定是父类对象的类型 父类对象不一定是子类对象的类型单继承: 语法: class 类名(基类名) 语句块 说明: 单继承是指由一各基类衍生出新的类 示例: # 单继承用法 class Human: # 人类的共性 def say(srlf, what): print("说:", what) def walk(self, distance): # 走路 print("走了", distance, "公里") class Student(Human): # 继承 # def say(srlf, what): # print("说:", what) # def walk(self, distance): # 走路 # print("走了", distance, "公里") def study(self, subject): # 派生 print("学习", subject) class Teacher(Student): def teach(self, subject): # 派生 print("教", subject) h1 = Human() h1.say("哈哈") h1.walk(500) s1 = Student() s1.walk(4) s1.say("666") s1.study("python") T1 = Teacher() T1.walk(4) T1.say("666") T1.teach("python") T1.study("Java") 继承说明: python3 任何类都可以直接或间接的继承object类 object类是一切类的超类(父类) class的继承参数不写, 默认继承object类 一般省略不写 object类的超类是None类的__base__属性: __base__ 属性用来记录此类的基类(父类)Python的内建类: help(__builtins__) 覆盖 override 覆盖是指在有继承关系的类中, 子类中实现了与基类同名的方法, 在子类 的实例调用该方法时, 实际调用的是子类的覆盖版本, 这种现象叫覆盖示例: # 覆盖 override class A: def works(self): print("A.works被调用") class B(A): '''B继承A类''' def works(self): print("B.works被调用") b = B() b.works() # B.works被调用 # B.works 覆盖 A.works 优先调用子类 # A派生B B继承A # 子类对象显示调用基类(被覆盖)方法的方式: # 基类.方法名(实例, 实际调用参数) A.works(b) # 用类名显示调用, A.works被调用 super 函数: super(cls, obj)返回绑定超类的实例(要求obj必须是cls类的实例) super() 返回绑定超类的实例, 等同于:super(__class__), 实例方法的第一个参数), 必须在方法内调用 作用: 借助于super()返回实例间接调用其父类的覆盖方法 # 用super函数返回的对象调用父类的覆盖方法 class A: def works(self): print("A.works被调用") class B(A): '''B继承A类''' def works(self): print("B.works被调用") def super_works(self): self.works() # B.works被调用 super(B, self).works() # A.works被调用 super().works() # A.works被调用 b = B() b.works() # B.works被调用 super(B, b).works() # A.works被调用 b = B() b.super_works() # B.works被调用 显示调用基类的初始化方法: 当子类中实现了__init__方法,基类的构造方法不会被调用 def __init__(self, ...) # 用super函数调用父类的覆盖__init__初始化方法 class Human: def __init__(self, n, a): self. name, self.age = n, a print("Human类的 __init__ 方法被调用") def infos(self): print("name:", self.name) print("age:", self.age) class Student(Human): def __init__(self, n, a, s=0): super().__init__(n, a) # 用siper 调用父类的__init__方法 self.score = s # 添加成绩属性 print("Student类的 __init__ 方法被调用") def info(self): super().infos() # 调用父类的方法 print("name:", self.name) print("age:", self.age) print("score:", self.score) # 不调用父类的方法也不会出错 但是尽量不要用 s1 = Student("小张", 20) s1.infos()

优秀的个人博客,低调大师

Python全栈工程师(函数嵌套、变量作用域)

ParisGabriel 感谢 大家的支持 每天坚持 一天一篇 点个订阅吧灰常感谢 当个死粉也阔以 Python人工智能从入门到精通 globals()/locals()函数: globals()返回当前全局作用域内变量的字典 locals() 返回当前局部作用域内变量的字典函数变量: 函数名是变量,它在def 语句创建时绑定函数 fa1 = fa 没有括号 绑定函数 fa1 = fa() 返回结果 函数的变量名可以序列交换算法一个函数可以作为另一个函数的实参传递:例如: def myinput(fn): L = [5, 3, 1, 9, 7] return fn(L) print(myinput(max)) print(myinput(min)) print(myinput(sum)) print(myinput(len)) 函数可以作为另一个函数的返回值:例如: def get_op(): s = input("qing shu ru cao zuo") if s == "zui da": return max elif s == "zui xiao": return min elif s == "he": return sum L = [2, 3, 4, 6,5, 6, 9, 1] print(L) f = get_op() print(f(L)) 函数的嵌套: 函数嵌套定义是指一个函数里用def语句来创建其他的函数 示例: def fn_outter(): print("fn_outter被调用") def fn_inner(): print("fn_inner被调用") fn_inner() fn_inner() print("fn_outter调用结束") fn_outter() Python的作用域: 作用域也叫名字空间,是访问变量时查找变量的范围空间 python的4个作用域: 作用域: 英文解释 缩写 局部作用域(函数内) Local(function) L 外部嵌套函数作用域 Enclosing functio loc E 函数定义所在模块(文件)作用域 Global(module) G python内建模块作用域 Builtin(python) B 包含关系(内建>模块>外部嵌套函数>函数内)变量名查找规则: 访问变量时,先查找本地变量,然后是包裹此函数外的函数内部的变量 ,之后是全局变量,最后是内建变量 L ---> E ---> G ---> B 在默认情况下,变量名赋值会创建或者改变当前作用域的变量global语句: 告诉解释执行器global语句声明一个或多个变量, 这些变量的作用域为模块级别的作用域,也称为全局变量全局声明(global) 将赋值语句操作的变量映射到模块文件内部的作用域 语法: global 变量1, 变量2, .... 说明: 1. 全局变量如果要在函数内部被赋值,则必须经过全局声明(否则会被认为是创建局部变量) 2. 全局变量在函数内部不经过声明就可以直接访问(变量已经存在并关联一个对象) 3. 不能先声明局部变量,再用global声明为全局变量,此做法不附合规则 4. global变量列表里的变量名不能出现在此作用域的形参列表里 nonlocal语句: 告诉解释执行器,nonlocal声明变量不是局部变量,也不是全局变量 它是外部嵌套函数变量 语法: nonlocal 变量名1,变量名2,... 说明: 1. nonlocal 语句只能在被嵌套的函数内部进行使用 2. 访问nonlocal变量将对外部嵌套函数作用域内的变量进行操作 3. 当有两层或两层以上函数嵌套时,访问nonlocal变量只对最近的一层变量进行操作 4. nonlocal语句的变量列表里的变量名,不能出现在此函数的参数列表中 lambda表达式(又称匿名函数)(希腊字母:入) 作用: 创建一个匿名函数对象 同def类似 但是不提供函数名 格式: lambda[ 参数1, 参数...]: 表达式 说明: 1. lambda 只是一个表达式,它用来创建一个函数对象 2. 当lambda表达式调用时,先执行冒号(:)后的表达式,并返回表达式的结果的引用关系 3. lambda 表达式创建的函数只能包含一条表达式 4. lambda 比函数简单且可以随时创建和销毁,有利于减少程序的偶合度 函数: eval () / exec() 函数 eval(source, globals=None, local=None) 把一个字符串 srouce 当成一个表达式来执行,返回表达式执行的结果 exec(source, globals=None, locals=None) 把一个字符串source 当成程序来执行 练习: 写一个函数叫hello(name),部分代码如下: count = 0 def hello(name): print('你好', name) ... 此处代码省略,需要同学们自己填写 ... 此处代码需要改变全局变量来记录此函数曾经被调用过多少次. hello('小张') hello('小李') print('hello 函数被调用', count, '次') # 2次 count = 0 def hello(name): global count count += 1 print("hello", name) hello("name") hello("xiaoli") hello("xiaoliu") hello("xiaowei") hello("xiaozhang") 1. 写一个lambda 表达式,判断这个数的2次方+1是否能被5整除,如果能被整除返回True, 否则返回False 例: fa = lambda x: ..... print(fa(2)) # True print(fa(4)) # False fa = lambda x: (x ** 2 + 1) % 5 == 0 print(fa(2)) # True print(fa(4)) # False 2. 写一个lambda表达式,求两个变量的最大值 例如: def mymax(x, y): ... mymax = lambda ... print(mymax(100, 200)) # 200 def mymax(x, y): if x > y: return x else: return y print(mymax(100, 200)) # 200 mymax = lambda x, y: x if x > y else y print(mymax(100, 200)) # 200 1. 给出一个整数n,写一个函数myfac来计算n!(n的阶乘) n! = 1 * 2 * 3 * 4 * ..... * n 如: print(myfac(5)) # 120 def myfac(n): x = 1 for i in range(1, n + 1): x = x * i return x print(myfac(5)) 2. 给出一个整数n,写一个函数计算myfn(n): 1 + 2**2 + 3**3 + .... + n**n的和 如: print(myfn(10)) # ??? def myfu(n): s = 0 for x in range(2, n + 1): s += x ** x return s print(myfu(10)) 3. 完全数: 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 ...... def mywqs(x): s = 0 L = [] for i in range(1, x): if x % i == 0: L.append(i) for i in L: s += i if s == x: return True else: return False i = 0 wqs = 0 while wqs < 5: i += 1 if mywqs(i) == True: print(i) wqs += 1 咳咳 又到了吹NB环节 locals()、globals() 就是一个查询函数 以字典形式返回信息而已函数变量? 你就就把它看做一个全局变量 变量绑定数据 而它绑定语句块 就这么简单什么是作用域? 作用域就是变量的所属范围 超过范围就失效 在别的地方一般是3个作用域 而python有4个 内建变量 局部变量 模块全局变量 特殊那个就是两个函数嵌套之间的范围(外部嵌套) 分别都是包含关系(内建>模块>外部嵌套函数>函数内) 内建函数 不可删除或修改 其他作用域 不能与内建函数重名 否则内建函数失效 只作用于当前空间自定义函数 各作用域各不相干 同空间不可重名 global 不管在任何空间使用global都直接声明全局变量 nonlocal 只能在被嵌套函数内部使用 多层嵌套 只会跳一层 lambda 用表达式创建一个函数 和if一样

优秀的个人博客,低调大师

Python全栈工程师(数值类型、运算符)

ParisGabriel Python 入门基础 python的应用领域: 1.系统运维 2.网络编程(如:网络爬虫,搜索引擎,服务器编程) 3.科学计算 4.航空领域(如:卫星,导弹,等) 5.人工智能,机器人 6.web开发、 7.云计算 8.大数据以及数据库开发 9.教育 10.游戏,图像处理 等等。。 python的优点: 1.面向对象(java、C++、python、C#、swift) 2.开源免费 3.跨平台(windows、Linux、Unix、iOS、Android) 4.混合编程(C、C++、java、.net) 5.应用领域广泛 python的缺点: 1.执行速度没有C、C++快、较慢的java、相对而言也比较慢 2.源代码不能加密 python的组成: 1.程序是由模块组成的 2.模块是由数据、函数、支持库、类等组成的 3.函数是由语句块组成的 4.语句块是有表达式组成的 Python的核心数据类型: (整数int,浮点数float,复数complex,布尔型bool、 字符串 str 列表 list 等) 1.十进制表示方式10 200 -100 999八进制:0o177(127)0o11(9) 2.十六进制:0x11(17)0xff(255)0x1a2b3.二进制:0b1110b101 整形数 int整数是不带小数的部分数字正数负数0浮点数:float带有小数部分的数字 复数分为两部分:实部(real)虚部(image)虚部是j或J结尾的数字面值:1j(2J)1+2J3-4Jbool有两种1.true 代表条件成立2.false 代表条件不成立true的值是1false的值是0 内置对象: None 是一个表示不存在的特殊对象(空值) 用来占位或解除变量的绑定 表达式: 由数字、数字和运算符组成 通常让计算机做一些事会返回结果 算数运算运算符: 1.+ 加法 2.- 减法 3.* 乘法 4./ 除法 5.// 地板除 6.** 幂运算 7.% 取余 / 除法: 得到的是浮点数 不会丢弃小数位 // 地板除: 得到的是整数型 字节舍去所有小数(没有四舍五入) % 取余: 取整除后所剩余的余数(7%3=1) ** 幂运算: 优先级: 1.** 2.* / // % 3.+ - 4.()内的优先级最高 优先级越高越先执行 同等优先级 从左往右依次执行 混合类型自动升级: 整数加浮点数结果为浮点数 基本输入函数: print(格式:print(要打印的内容)) 多个数据类型要用“,”分开 变量: 变量就是关联一个对象的标识符并且区分字母大小写 标识符的命名: 必须以下划线或字母开头,后面跟字母、下划线、整数 不能使用Python的关键字命名 赋值运算符: “=” 语法: 变量名=表达式 变量名1=变量名2=表达式 变量名=表达式=序列 创建一个变量,此变量用来绑定数据对象 修改一个变量的绑定关系 让其绑定另一个对象 当变量不存在时创建变量 同事将对象绑定在变量上 当变量存在时改变变量的对象 一个人变量只能绑定一个对象 一个对象可以绑定多个变量 序列赋值: a,b = 100,200 Python的自动化内存管理: a=a+b 释放a a=a+b的和 变量的交换: 交换算法: >>> a=10 >>> b=20 >>> a=a+b >>> b=a-b >>> a=a-b >>> a 20 >>> b 10 第三变量: >>> a=20 >>> b=10 >>> c=a >>> a=b >>> b=c >>> a 10 >>> b 20 序列赋值: >>> a=10 >>> b=20 >>> a,b=20,10 >>> a 20 >>> b 10 >>> 删除变量: del >>> del a 删除变量的同时解除与对象的关联关系,如果能则释放对象 help(“——main——”) tarena@tedu:~$ python3 Python 3.5.2 (default, Nov 17 2016, 17:05:23) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> a = 100 >>> help("__main__") 在交互模式下查看当前作用域的所有变量 Q退出查看 自动化内存管理和引用计数: 每个对象都会记录有几个变量绑定自身,当引用的数量为0时则此对象将被销毁 并且释放内存资源 此种自动化内存管理的方式叫引用计数 is/is not 运算符作用:判断两个对象是否是一个对象,当是同一个对象时返回true否则返回 falseis not返回值与is相反 id(obj)函数: 返回一个对象在内存中的地址(id(对象) 小整数对象值:CPython中 ,整数-5到256的数永远存在于小数池中不会释放且可重复使用符合赋值算数运算符:y += x 等同于 y = y + xy -= x 等同于 y = y - xy *= x 等同于 y = y * xy /= x 等同于 y = y / xy //= x 等同于 y = y // xy %= x 等同于 y = y % xy **= x 等同于 y = y ** x 练习:写程序打印出1.古代的秤是16两一斤 请问216两是几斤几两 print("Answer to question 1:") print(216 // 16, "axe", 216 % 16, "liang") 2.冲凌晨0:0:0计时 到现在已经过了63320秒 现在是几时几分几秒 print("Answer to question 2:") time = 63320 time // 3600 a = time % 3600 a // 60 a % 60 print(time // 3600, "小时", a // 60, "分钟", a % 60, "秒") 3.温度转换:摄氏度=5.0/9.0*(华氏度-32)请问100华氏度是多少摄氏度?如果当前温度是摄氏度温度能否算出华氏度温度是多少? print("Answer to question 3:") a = 5.0 / 9.0 * (100 - 32) print("100华氏度=", a, "摄氏度") a = 100 * 9 / 5 + 32 print("100摄氏度=", a, "华氏度")

优秀的个人博客,低调大师

Python全栈工程师(异常(高级)、运算符重载)

ParisGabriel 每天坚持手写一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python人工智能从入门到精通 对象的属性管理函数: getattr(obj, name[,default) 从对象得到对象的属性,getattr(x, “y”) 等同于x, y 当属性 不存在时 如果给出default参数则返回default 如果没有给出default ,则产生一个AttributeError错误 hasattr(obj, name)用给定的name返回对象obj是否有此属性 此种做法可以避免在getattr(obj,name)时引发错误 setattr(obj, name, value) 给对象obj的名为name的 属性设置相应的值value, set(x, 'y', v) 等同于 x.y = v delattr(obj, name) 删除对象obj中的name属性 , delattr(x, 'y') 等同于 del x.y 示例: class Dog: pass d = Dog() d.color = "白色" v = getattr(d, "color") # 等同于 v = d.color v = getattr(d, "kinds") # 出错,没有d.kinds属性 v = getattr(d, "kinds", "没有这个属性") # v= '没有这个属性' hasattr(d, 'color') # True hasattr(d, 'kinds') # False setattr(d, 'kinds', '京巴') # 等同于d.kinds ='京巴' hasattr(d, 'kinds') # True delattr(d, 'kinds') # 等同于 del d.kinds hasattr(d, 'kinds') # False 异常(高级): 可以用于异常的语句 try-except # 捕获异常,得到通知 try-finally # 左任何流程(正常/异常)都必须执行要执行的语句 raise # 发送异常 assert # 根据条件发送异常通知with 语句: 语法: with 表达式1[as 变量1], 表达式2[as 变量2].... 作用: 使用与对资源进行访问的场合,确保使用过程中不管 是否发生异常都会执行必要的“清理操作”,并释放资源 (如: 文件使用后自动关闭,线程中锁的自动获取和释放等) 说明: 执行表达式,as子句中的变量绑定生成的对象 with语句并不改变异常的状态示例: # with语句打开文件和自动关闭 try: with open("a.txt") as f: for x in f: print(x) int("abc") # 出现异常 except OSError: print("文件打开失败") except ValueError: print("文件操作过程中错误") # try-finally语句打开文件和关闭 try: f = open("a.txt") for x in f: print(x) except OSError: print("打开文件失败") except ValueError: print("文件操作过程中错误") finally: f.close() # 修改原来的copy文件功能 src_filename = input("请输入源文件路径名: ") dst_filename = input('请输入目标文件路径名: ') try: with open(src_filename, 'rb') as src,\ open(dst_filename, 'wb') as dst: # 打开源文件用来读数据 while True: b = src.read(4096) if not b: # 已经再也读不到数据了 break dst.write(b) print("复制成功") except OSError: print("复制失败") 环境管理器: 类内有__enter__和__exit__实例方法的类被称为环境管理器 能够用with进行管理的对象必须是环境管理器 说明: __enter__将在进入with语句时被调用并返回由as变量绑定的对象 __exit__将在离开with语句时被调用,且可以用参数来判断在 离开with语句时是否有异常发生并作出相应的处理示例: # 一个自定义的类创建的对象能够使用with语句 class A: '''此类的对象可用于with语句进行管理''' def __enter__(self): print("已经进入with语句中,资源分配成功") return self # <<<-- 此处返回的对象将由as变量绑定 def __exit__(self, exc_type, exc_val, exc_tb): print("离开with语句,资源释放成功") if exc_type is None: print("当离开with语句时没有异常") else: print("有异常发生 异常类型:",exc_type , "异常值:", exc_val) with A() as a: print("这是with语句中的语句") raise ValueError("故意制造的异常") 运算符重载: 什么是运算符重载 让自定义的类生成的对象(实例)能够使用运算符进行操作 作用: 1.让自定义的类的实例能够运行运算符操作 2.让程序简洁易读 3.对定义对象将运算符赋予新的运算规则 说明: 运算符重载方法的参数已经有固定含义,不建议改变原有的含义 算数运算符重载: 方法名 运算符和表达式 说明__add__(self, rhs) self + rsh 加法__sub__(self, rhs) self - rsh 减法__mul__(self, rhs) self * rsh 乘法__truediv__(self, rhs) self / rsh 除法__floordiv__(self, rhs) self // rsh 地板除__mod__(self, rhs) self % rsh 求模__pow__(self, rhs) self ** rsh 幂 rhs(self hand side) 右手边 示例: class MyNumber: def __init__(self, val): self.data = val def __repr__(self): return "%d" % self.data def __add__(self, rsh): v = self.data + rsh.data return MyNumber(v) def __sub__(self, rsh): return MyNumber(self.data - rsh.data) n1 = MyNumber(100) n2 = MyNumber(200) n3 = n1 + n2 # 等同于 n3 = n1.__add__(n2) # n3 = n1.__add__(n2) print(t(n1, "-", n2, "=", n1 - n2) 反向算术运算符的重载 当运算符的左侧为内建类型,右侧为自义类型的对象进行算术运算符运算时,会出现TypeError错误, 因无法修改内建类的代码来实现运算符重载,此时需要使用反向算术运算符重载 反向算术运算符重载 方法名 运算符和表达式 说明__radd__(self, lhs) lhs + self 加法__rsub__(self, lhs) lhs - self 减法__rmul__(self, lhs) lhs * self 乘法__rtruediv__(self, lhs) lhs / self 除法__rfloordiv__(self, lhs) lhs // self 地板除__rmod__(self, lhs) lhs % self 取模(求余)__rpow__(self, lhs) lhs ** self 幂 lhs(left hand side) 右手边 示例: # 此示例示意返向算述运算符的重载 class MyList: def __init__(self, lst=[]): '''在初始化方法内为每个对象都创建一个bata属性 bata 用来绑定每个对象自己的列表 ''' self.beta = [x for x in lst] # self.bata = list(lst) def __repr__(self): return "%s" % self.beta def __mul__(self, rhs): return MyList(self.beta * rhs) print("__mul__ 被到调用") def __rmul__(self, lhs): print("__rmul__ 被到调用") return MyList(self.beta * lhs) # 反向传参 L1 = MyList([1, 2, 3]) L2 = MyList(range(4, 7)) L3 = 2 * L1 # L1.__rmul__(2) print(L3) L5 = L1 * 2 # L5 = L1.__mul__(2) print(L5) # MyList([1, 2, 3, 1, 2, 3]) 复合赋值算术运算符的重载 以复合赋值算术运算符 x += y 为例,此运算会优先调用x.__iadd__(y) 方法, 如果没有__iadd__方法时会将复合赋值运算拆解为 x = x + y,然后调用x = x.__add__(y) 方法 如果再不存在 __add__方法则会触发TypeError异常 其它复合赋值运算符也具有相同的规则 复合赋值算术运算符重载 方法名 运算符和表达式 说明__iadd__(self, lhs) lhs += self 加法__isub__(self, lhs) lhs -= self 减法__imul__(self, lhs) lhs *= self 乘法__itruediv__(self,lhs) lhs /= self 除法__ifloordiv__(self, lhs) lhs //= self 地板除__imod__(self, lhs) lhs %= self 取模(求余)__ipow__(self, lhs) lhs **= self 幂 示例: class MyList: def __init__(self, lst=[]): '''在初始化方法内为每个对象都创建一个bata属性 bata 用来绑定每个对象自己的列表 ''' # self.beta = [x for x in lst] self.bata = list(lst) def __repr__(self): return "%s" % self.beta def __iadd__(self, rhs): self.beta += rhs.beta # id不变 return self def __add__(self, rhs): return MyList(self.beta + rhs.beta) # id会不变 L = MyList([1, 2, 3]) def f1(lst): lst += MyList([4, 5, 6]) f1(L) print(L) 复合赋值算术运算符重载 方法名 运算符和表达式 说明__lt__(self, rhs) self < rhs 小于__le__(self, rhs) self <= rhs 小于等于__gt__(self, rhs) self > rhs 大于__ge__(self, rhs) self >= rhs 大于等于__eq__(self, rhs) self == rhs 等于__ne__(self, rhs) self != rhs 不等于示例: # 此示例示意比较运算符的重载 class MyList: def __init__(self, iterable): self.data = list(iterable) def __repr__(self): return 'MyList(%s)' % self.data def __eq__(self, rhs): return self.data == rhs.data def __gt__(self, rhs): return self.data > rhs.data L1 = MyList([1, 2, 3]) L2 = MyList([1, 2, 3]) print(L1 == L2) # True print(L1 > L2) # False # print(L1 == L2) # 如果没有__eq__ 方法判断两个对象的id # print(L1 > L2) # 如果没有__gt__ 方法报错 位运算符重载 方法名 运算符和表达式 说明 __invert__(self) ~ self 取反(一元运算符) __and__(self, rhs) self & rhs 位与 __or__(self, rhs) self | rhs 位或 __xor__(self, rhs) self ^ rhs 位异或 __lshift__(self, rhs) self << rhs 左移 __rshift__(self, rhs) self >> rhs 右移 反向位运算符重载 方法名 运算符和表达式 说明 __rand__(self, lhs) lhs & self 位与 __ror__(self, lhs) lhs | self 位或 __rxor__(self, lhs) lhs ^ self 位异或 __rlshift__(self, lhs) lhs << self 左移 __rrshift__(self, lhs) lhs >> self 右移 复合赋值位运算符重载 方法名 运算符和表达式 说明 __iand__(self, rhs) self &= rhs 位与 __ior__(self, rhs) self |= rhs 位或 __ixor__(self, rhs) self ^= rhs 位异或 __ilshift__(self, rhs) self <<= rhs 左移 __irshift__(self, rhs) self >>= rhs 右移 一元运算符重载 方法名 运算符和表达式 说明 __invert__(self) ~ self 取反(一元运算符) __pos__(self) + self 正号 __neg__(self) - self 负号 语法: def __xxx__(self): 示例: # 此示例示意一元运算符的重载 class MyList: def __init__(self, lst=[]): '''在初始化方法内为每个对象都创建一个bata属性 bata 用来绑定每个对象自己的列表 ''' self.beta = [x for x in lst] # self.bata = list(lst) def __repr__(self): return "%s" % self.beta def __neg__(self): return MyList((-x for x in self.beta)) def __pos__(self): return MyList((abs(x) for x in self.beta)) # L = [] # for x in self.beta: # if x > 0: # L.append(x) # else: # L.append(-x) # return MyList(L) L1 = MyList([1, -2, 3, -4, 5]) L2 = -L1 print(L2) # MyList([-1, 2, -3, 4, -5]) # 实现用正号运算符返回全部元素为正数的自定义列表 L3 = + L1 print(L3) # MyList([1, 2, 3, 4, 5]) in / not in 运算符重载重载方法:def __contains__(self, e):....示例: # in not in 重载 class MyList: def __init__(self, lst=[]): '''在初始化方法内为每个对象都创建一个bata属性 bata 用来绑定每个对象自己的列表 ''' self.beta = [x for x in lst] # self.bata = list(lst) def __repr__(self): return "%s" % self.beta def __contains__(self, e): return e in self.beta L1 = MyList([1, 2, -3, 4, -5]) print(2 in L1) print(3 in L1) print(4 in L1) print(5 in L1) 索引和切片运算符的重载 方法名 运算符和表达式 说明 __getitem__(self, i) x = self[i] 索引/切片取值 __setitem__(self, i, val) self[i] = val 索引/切片赋值 __delitem__(self, i) del self[i] 删除索引/切片 作用:让自定义的类的对象能够支持索引和切片操作示例: # 此示例示意 索引/切片 运算符的重载 class MyList: def __init__(self, iterable): self.data = list(iterable) def __repr__(self): return 'MyList(%s)' % self.data def __getitem__(self, i): print("索引i的值是:", i) return self.data[i] def __setitem__(self, i, v): print("__setitem__被调用, i=", i, 'v=', v) self.data[i] = v def __delitem__(self, i): del self.data[i] L1 = MyList([1, -2, 3, -4, 5]) v = L1[2] # v = 3 print(v) # 3 L1[1] = 2 print(L1) # MyList([1, 2, 3, -4, 5]) del L1[3] print(L1) # MyList([1, 2, 3, 5]) slice 函数: 作用: 用于创建一个slice切片对象,此对象存储切片的信息 格式: slice(start=None, stop=None, step=None) slice对象的属性 s.start 切片的起始值, 默认为None s.stop 切片的终止值, 默认为None s.step 切片的步长, 默认为None示例: # 此示例示意 索引/切片 运算符的重载 class MyList: def __init__(self, iterable): self.data = list(iterable) def __repr__(self): return 'MyList(%s)' % self.data def __getitem__(self, i): print("索引i的值是:", i) if type(i) is int: print("正在进行索引操作") elif type(i) is slice: print("正在进行切片操作") print("起始值是:", i.start) print("终止值是:", i.stop) print("步长值是:", i.step) return self.data[i] def __setitem__(self, i, v): print("__setitem__被调用, i=", i, 'v=', v) self.data[i] = v def __delitem__(self, i): del self.data[i] L1 = MyList([1, -2, 3, -4, 5]) L2 = L1[::2] print(L2) 特性属性 @property 实现其它语言所拥有的 getter 和 setter 的功能 作用: 用来模拟一个属性 通过@property 装饰器可以对模拟属性的取值和赋值加以控制 示例见: 示例: class Student: def __init__(self, s): self.__score = s # 私有属性,不让其它人任意修改成绩 @property def score(self): '''伪装模拟私有一个成绩属性 并返回成绩''' return self.__score @score.setter def score(self, v): '''实现设置者setter , 对用户的复制加以限制''' assert 0 <= v <= 100, "成绩不合法" self.__score = v s = Student(59) print(s.score) # 希望有一个属性能得到成绩 虚拟属性不能复制 s.score = 80 # 通过s.score 来修改成绩 print(s.score) # 修改成功 s.score看似属性 是模拟属性 实际内部已经被替换 问题: L = [1, 2, 3] def f1(lst): lst += [4, 5, 6] f1(L) print(L) # [1, 2, 3, 4, 5, 6] 为什么 L = (1, 2, 3) def f1(lst): lst += (4, 5, 6) # lst = lst + (4, 5, 6) f1(L) print(L) # (1, 2, 3) 为什么 练习: 1. 实现两个自定义的列表相加 class MyList: .... 此处自己实现 L1 = MyList([1, 2, 3]) L2 = MyList(range(4, 7)) L3 = L1 + L2 print(L3) # MyList([1, 2, 3, 4, 5, 6]) L4 = L2 + L1 print(L4) # MyList([4, 5, 6, 1, 2, 3]) L5 = L1 * 2 print(L5) # MyList([1, 2, 3, 1, 2, 3]) 练习: 实现有序集合类 OrderSet() 能实现两个集合的交集 &,全集 |, 补集 - 对称补集 ^, ==/!= , in/ not in 等操作 要求集合内部用 list 存储 class OrderSet: ... s1 = OrderSet([1, 2, 3, 4]) s2 = OrderSet([3, 4, 5]) print(s1 & s2) # OrderSet([3, 4]) print(s1 | s2) # OrderSet([1, 2, 3, 4, 5]) print(s1 ^ s2) # OrderSet([1, 2, 5]) if OrderSet([1, 2, 3]) != OrderSet([3, 4, 5]): print("不相等") if s2 == OrderSet(3, 4, 5): print('s2 == OrderSet(3, 4, 5) is True') if 2 in s1: print("2在 s1中")

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册