print('{} 考了{}分'.format(self.name, self.score)) return '{} 考了{}分'.format(self.name, self.score) def get_score_level(self): if self.score > 90: return "A" elif self.score > 80: return "B" else: return "继续努力" tom = Student('tom', 18, 90) lucy = Student('lucy', 18, 90) tom.weight = '66.5kg' pu.print_line_separator("类的实例->打印Student对象实例") print(Student) print(tom) # print(lucy.weight) # 我们只给tom实例赋了weight属性 所以打印lucy.weight 会 "AttributeError: 'Student' object has no attribute 'weight'" print("name: {} ,age:{} ,score:{}分 ,体重:{}".format(tom.name, tom.age, tom.score, tom.weight)) print("{} ,属于:{}".format(tom.team_score(), tom.get_score_level())) pu.print_line_separator("访问限制->属性的名称前加上两个下划线") class Student2(object): def __init__(self, name, address, gender): self.name = name self.__address = address self.__gender = gender
import util.PrintUtil as pu l1 = ["wangwu", "lisi", "zhangsan", "zhaoliu"] l2 = [89, 90, 77] z = zip(l1, l2) print("list(z): {}".format(list(z))) pu.print_line_separator() ''' 和Python2的区别(一):返回的是一个迭代器,而不是一个list本身 上面已经打印了一次了 所以下面再遍历的话就是[] 因为迭代器只能遍历一次 ''' print("type(z):{} ".format(type(z))) for i in z: print(id(i)) print(i, sep=" ") pu.print_line_separator() l3 = [i for i in list(z)] print("type(l3):{} len(l3):{}".format(type(l3), len(l3))) print(l3) # print(help(zip))
hello_world() a = ["1", "2", "3"] b = ["a", "b", "c"] m = (m + n for m in a for n in b) n = [m + n for m in a for n in b] print("a: {}".format(a)) print("id(a): {}".format(id(a))) print("b: {}".format(b)) print("m: {}".format(m)) print("id(m) : {}, type(m):{}".format(id(m), type(m))) print("id(n) : {}, type(n):{}".format(id(n), type(n))) pu.print_line_separator() #一只敏捷的棕色狐狸跳到了一只懒狗身上。该句据说是包含所有26个字母的最短的句子。 print('The quick brown fox', 'jumps over', 'the lazy dog') print('100 + 200 =', 100 + 200) #name = input("请输入你的名称: ") #print("欢迎: ",name) pu.print_line_separator("print中可以使用'''来打印多行") print(''' hha hhe heih xix
''' python文件操作: 文件读写 /StringIO/BytesIO / 操作文件和目录 / 序列化 ''' import util.PrintUtil as pu from io import StringIO from io import BytesIO import os import json ''' 很多时候,数据读写不一定是文件,也可以在内存中读写。 StringIO顾名思义就是在内存中读写str。 要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可: ''' pu.print_line_separator("StringIO使用") f = StringIO() f.writelines(''' hello python io ''') s = f.getvalue() print(s) pu.print_line_separator("使用StringIO读取") f = StringIO('我是StringIO字符串\nbyebye') while True: s = f.readline() if s == '': break
def __str__(self): return 'Student object (name=%s)' % self.name __repr__ = __str__ ''' def __str__(self): return 'Student name is :{} '.format(self.name) def __repr__(self): return 'Student name is :{} '.format(self.name) def __call__(self, *args, **kwargs): print('my name is %' % self.name) pu.print_line_separator('通过@property来访问属性,并可以设置属性校验') s = Student("Tom") s.score = 99 print(s.score) # s.score = 110 # 超过限制的话 就会rasie异常 print(s) pu.print_line_separator('通过callable函数判断一个对象是否可调用') print(callable( Student('Jerry'))) # 此时返回的是 False 但Student类中定义 __call__方法后 打印即是Ture print(callable(max)) pu.print_line_separator('利用完全动态的__getattr__,我们可以写出一个链式调用') class Chain(object):
sorted()也是一个高阶函数。用sorted()排序的关键在于实现一个映射函数。 ''' from functools import reduce import util.PrintUtil as pu import time, functools def add(x, y, f): return f(x) + f(y) pu.print_line_separator("高阶函数add调用") result = add(-1, 4, abs) print("高阶函数add调用结果: {}".format(result)) pu.print_line_separator("高阶函数求两个list中最大\最小值的和") def listPlus(list1, list2, plus1, plus2): return plus1(list1) + plus2(list2) list1 = [1, 4, 5] list2 = [100, 200, 500] listMaxPlus = listPlus(list1, list2, max, min) print("求两个list最大元素之和: {}".format(listMaxPlus))
print('thread %s is running...' % threading.current_thread().name) n = 0 while n < 5: n = n + 1 print('thread %s >>> %s' % (threading.current_thread().name, n)) # time.sleep(1) print('thread %s ended.' % threading.current_thread().name) print('thread %s is running...' % threading.current_thread().name) t = threading.Thread(target=loop, name='LoopThread') t.start() t.join() print('thread %s ended.' % threading.current_thread().name) pu.print_line_separator('多线程共享变量') # 假定这是你的银行存款: balance = 0 def change_it(n): # 先存后取,结果应该为0: global balance balance = balance + n balance = balance - n lock = threading.Lock()
def calc(exp): ss = exp.split('+') ns = map(str2num, ss) return reduce(lambda acc, x: acc + x, ns) def main(): r = calc('100 + 200 + 345') print('100 + 200 + 345 =', r) r = calc('99 + 88 + 7.6') print('99 + 88 + 7.6 =', r) main() pu.print_line_separator("以下用于单元测试") class Student(object): def __init__(self, name, score): self.name = name self.score = score def get_grade(self): if self.score < 0: raise ValueError('分值不能小于0') if self.score > 100: raise ValueError('分值不能高于100') if self.score >= 60 and self.score < 80: return 'B'
def sayHello(self): self.name = "hu" self.address = "华星现代产业园" print("hello {} , age : {} ,address:{}".format(self.name, self.age, self.address)) print("访问类的成员属性(非实例的)使用__class__.address : {}".format( __class__.address)) class Student2(Student): name = None age = 1 # pass s = Student() print("s.name = %s,s.age = %s" % (s.name, s.age)) #print("s.nickname = ".format(s.__nickname)) s.sayHello() pu.print_line_separator("访问私有属性") # 其实python的私有不是真正意义上的私有 只是使用了 name mangling技术 如果真要访问的话 可以使用下面方法 print(Student.__dict__) print("访问私有属性 nickname: {0}".format(s._Student__nickname)) pu.print_line_separator() # 可以直接把Student2当作参数传递, Python是弱语言 若sayHello中有用到Student2中不存在的属性 会报错 Student.sayHello(Student2)
如果有必要,可以先对参数的数据类型做检查; 函数体内部可以用return随时返回函数结果; 函数执行完毕也没有return语句时,自动return None。 函数可以同时返回多个值,但其实就是一个tuple。 ''' # 函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”: alias_abs = abs print(alias_abs(-1)) print(hex(12)) # 0xc 十六进制0x开头 pu.print_line_separator("定义函数") def my_abs(x): # 不加这个判断的话 TypeError: '>' not supported between instances of 'str' and 'int' 会是这个错误 if not isinstance(x, (int, float)): raise TypeError('bad operand type ') if x > 0: return x else: return -x print(my_abs(1)) print(my_abs(-11)) # print(my_abs('x'))
import re import util.PrintUtil as pu p = re.compile(r'\d+') str = '1afb123fdkfwlernlrn9258523' # re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。 m = p.match(str) print(m) print(m.group(0), m.start(0), m.end(0)) print(m.groups()) print(p.search(str)) print(p.findall(str)) mm = p.match(str, 4, 6) print(mm) pu.print_line_separator("正则表达式 sub") pp = re.compile(r'(\w+) (\w+)') s = 'hello 123 wol 234,I love pp' rst = pp.sub(r'Hello RE', s) print(rst) pu.print_line_separator('正则表达式匹配中文 [u4e00-u9fa5]') title = u'世界 你好,Hello World' p = re.compile(r'[\u4e00-\u9fa5]+') print(p.findall(title)) pu.print_line_separator('匹配模式【默认是贪婪/使用?表示非贪婪】') htm = '<div>wo shi div</div><div>123</div>' p1 = re.compile(r'<div>.*</div>') p2 = re.compile(r'<div>.*?</div>')