Python基础语法

七月在线之python基础入门

python的环境搭建

python包下载链接

https://pypi.org/

下载Anaconda 的方法

搜索Anaconda 清华镜像→点击并进入清华大学开源软件镜像站→点击链接→选择合适的anaconda安装包
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
在这里插入图片描述

网页编程方式

安装完annaconda后,打开Jupyter Notebook。

python规则

编程基础

exec, eval,help,三元表达式,unpack解包,*号收集,推导式,常用功能

# exec执行声明语句, eval执行表达式
	exec('feng = 7')
	feng
	Out[4]: 7
	'feng'
	Out[5]: 'feng'
	eval('feng')
	Out[6]: 7

# 使用帮助
	help(exec)
	Help on built-in function exec in module builtins:
	exec(source, globals=None, locals=None, /)
	    Execute the given source in the context of globals and locals.
	    
	    The source may be a string representing one or more Python statements
	    or a code object as returned by compile().
	    The globals must be a dictionary and locals can be any mapping,
	    defaulting to the current globals and locals.
    
#文本转义
	print('I\' am 007')
	I' am 007

#交换赋值
	a,b=b,a
	
#命名
	# 普通命名法
		teacher_name='david'
		teacher_name
		
		Out[29]: 'david'
	# 直接命名法
		globals()['teacher']='feng'
		teacher
		
		Out[31]: 'feng'
		
#unpack解包
	l1=[1,2,3,4,5,'6']
	a,b,c,d,e,f=l1
	print(a,b,c,d,e,f)
	1 2 3 4 5 6

#三元表达式
	age=18
	'a' if age>50 else 'b'
	Out[58]: 'b'
	
	# expression只能放在左边,因为三元只能对一个变量操作。。
	a=b=c=15
	a=5 if b>20 else 3
	a
	Out[63]: 3
# copy.copy和copy.deepcopy
	import copy
	a = [1, 2, 3, 4, ['a', 'b']]  # 原始对象 
	b = a  # 赋值,并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变
	c = copy.copy(a)  # 浅拷贝,只拷贝父对象,子对象会跟着变。
	d = copy.deepcopy(a)  # 深拷贝,即将被复制对象完全再复制一遍作为独立的新个体单独存在
	a.append(5)  # 修改对象a 
	a[4].append('c')  # 修改对象a中的['a', 'b']数组对象 
	
	a
	Out[62]: [1, 2, 3, 4, ['a', 'b', 'c'], 5]
	b
	Out[63]: [1, 2, 3, 4, ['a', 'b', 'c'], 5]
	c
	Out[64]: [1, 2, 3, 4, ['a', 'b', 'c']]
	d
	Out[65]: [1, 2, 3, 4, ['a', 'b']]

#*号收集
	l1=[1,2,3,4,5,'6']
	a,*b,c=l1   #  a 接收1,c接收6,其余放在b中
	print(a,b,c)
	1 [2, 3, 4, 5] 6
	c
	Out[19]: '6'
	
	type(c)
	Out[22]: str

# 字典推导式:
	# 用字典推导式求一个字符串,以及它的位置下标
		str1=['i','love','china']
		{key:value for key,value in enumerate(str1)}
		
		Out[12]: {0: 'i', 1: 'love', 2: 'china'}
	
	# 用字典推导式求一个字符串,以及它的位置下标.(以最后一次出现的字符求位置索引)
		str1='i love china for ever!'
		{item:itemno for itemno,item in enumerate(str1)}
		
		Out[3]: 
		{' ': 16,
		 '!': 21,
		 'a': 11,
		 'c': 7,
		 'e': 19,
		 'f': 13,
		 'h': 8,
		 'i': 9,
		 'l': 2,
		 'n': 10,
		 'o': 14,

# 常用功能说明
	help(obj) 在线帮助, obj可是任何类型    
	
	
	eval(str) 表示合法的python表达式,返回这个表达式 
	exec(str) 执行合法的python声明,返回字节码
	
	
	#名字空间相关
	dir(obj) 查看obj的name space中可见的name
	vars(obj) 返回一个object的name space。用dictionary表示    
	locals() 返回一个局部name space,用dictionary表示    
	globals() 返回一个全局name space,用dictionary表示
	
	#类型
	type(obj) 查看一个obj的类型    
	isinstance(obj,cls) 查看obj是不是cls的instance    
	issubclass(subcls,supcls) 查看subcls是不是supcls的子类  
	
	#类型转换
	chr(i) 把一个ASCII数值,变成字符    
	ord(i) 把一个字符或者unicode字符,变成ASCII数值    
	oct(x) 把整数x变成八进制表示的字符串    
	hex(x) 把整数x变成十六进制表示的字符串    
	str(obj) 得到obj的字符串描述    
	list(seq) 把一个sequence转换成一个list    
	tuple(seq) 把一个sequence转换成一个tuple    
	dict(),dict(list) 转换成一个dictionary    
	int(x) 转换成一个integer    
	long(x) 转换成一个long interger    
	float(x) 转换成一个浮点数    
	complex(x) 转换成复数
	
# 查找,替换,统计
	str3='http://{}.com'
	#查找与替换
		str3.find('o')
		str3.replace('.com','.net')
	
	#统计
		str3.count('com')

可迭代对象Iterable,迭代器iterator,生成器generator

在这里插入图片描述
迭代对象:
以直接作用于 for 循环的数据类型有以下几种:
一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
一类是 generator ,包括生成器和带 yield 的generator function。
这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。

说明:
1.凡是可作用于 for 循环的对象都是 Iterable 类型;
2.凡是可作用于 next() 函数的对象都是 Iterator 类型
3.集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,
不过可以通过 iter() 函数获得一个 Iterator 对象。

# 迭代器
	# 可以使用 isinstance() 判断一个对象是否是 Iterable 对象:
		from collections import Iterable
		a = isinstance([], Iterable)
		b = isinstance({}, Iterable)
		c = isinstance("abc", Iterable)
		d = isinstance(100, Iterable)
		e = isinstance((x for x in range(10)), Iterable)
		print(a)   # True
		print(b)   # True
		print(c)   # True
		print(d)   # False  因为是Number
		print(e)   # True

	# 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
		
		#可以使用 isinstance() 判断一个对象是否是 Iterator 对象:
		from collections import Iterator
		a = isinstance([], Iterator)
		a1 = isinstance(iter([]), Iterator) 
		b = isinstance({}, Iterator)
		c = isinstance("abc", Iterator)
		d = isinstance(100, Iterator)
		e = isinstance((x for x in range(10)), Iterator)
		
		print(a)   #false
		print(a1)  #True
		print(b)   #false
		print(c)   #false
		print(d)   #false
		print(e)   #true
		
	# 用列表推导式(还可以是字典,集合等等)生成迭代器
		l1 = [x for x in range(30) if x%3==0]  
		# l1通过列表推导式生成一个containner。因为它是可以被for循环的,因此这个containner又是一个iterable可迭代的,iterable不一定是一个可迭代器iterator,需要加iter。iterator都是iterable。
		
		l2 = iter(l1)
		next(l2)
		Out[52]: 0
		next(l2)
		Out[53]: 3
		next(l2)
		Out[54]: 6

创建生成器generator的方式有多种,我们学习其中两个常见的方式:
方式1:
用generator expressin生成一个生成器generator,只要把一个列表生成式的 [ ] 改成 ( )

方式2:
用generator function生成一个生成器generator。

# 生成器 
	# 用generator expressin生成一个生成器generator
		l1 = (x for x in range(30) if x % 3 == 0)  # []改为()
		
		next(l1)
		Out[5]: 0
		next(l1)
		Out[6]: 3
		type(l1)
		Out[7]: generator
		
		# 可以for循环去拿所有的
		for i in l1:
		    print(i)
		    
		6
		9
		12
		15
		18
		21
		24
		27


	# 用generator function(如里面的yield)生成一个生成器generator
		# 例1: 生成1,1,2,3,5这样的序列
			# 普通方法
				def fib():
				    a = 0
				    b = 0
				    c = 1
				    while a<5:
				        
				        temp = c
				        c = c + b
				        b = temp
				        
				        a += 1
				        print(b)
				
				fib()
				
			# 应用yeild	
				def fib():
				    a = 0
				    b = 0
				    c = 1
				    while a < 5:
				        # temp = c
				        # c = b + c
				        # b = temp
				        #
				        # a += 1
				        # print(b)
				        yield c
				        b,c = c,b+c
				        a += 1
				
				f = fib()
				print(next(f))
				print(next(f))
				print(next(f))
				
				# 结果
				1
				1
				2
				
		# 例2				
			# 这里的yeild返回值,但并不停止,return返回并停止
			def g2_func(n):
			    for i in range(n):
			        yield i ** 2
			
			
			g2 = g2_func(7)
			next(g2)
			Out[5]: 0
			next(g2)
			Out[6]: 1
			next(g2)
			Out[7]: 4
			next(g2)
			Out[8]: 9

闭包,装饰器

# 闭包
	def func1():
	    print("haha")
	
	def outer(func):
	    def inner():
	        print("*******************")
	        func()
	    return inner
	    
	# 执行文件
	f = outer(func1)     # 相当于inner
	print(f)
	f()                  # 相当于inner()
	
	# 执行结果
	<function outer.<locals>.inner at 0x0000003F2BE377B8>
	*******************
	haha
	
# 装饰器
	# 例1:
		def w1(func):
		    def inner():
		        # 验证1
		        # 验证2
		        # 验证3
		        func()
		    return inner
		
		@w1
		def f1():
		    print('f1')
		
		f = f1
		f()
		
		# 结果
		f1
	# 例2:	
	# 多个函数实现不同功能普遍做法,但费时费力,如下
		def fun1():
		    print('this is foo1 function')
		
		def fun2():
		    print('this is foo2 function')
		
		def fun3():
		    print('this is foo3 function')
		
		
		# 为以上三个函数添加报时功能
		import datetime
		
		
		# 设计一个能接收函数的函数,功能是打印时间后,然后返回接收到的函数
		def outer_fun(func):
		    print(datetime.datetime.now())
		    return func
		
		
		outer_fun(fun2)()
		# 输出结果
		2019-08-15 17:30:04.253557
		this is foo2 function

	# 例3import datetime
		
		
		def outer_fun(fun):
		    # do something you want here
		    str1 = 'This is string from outer'
		
		    def inner():
		        print(str1)
		        print('from inner to execute:', fun.__name__)
		        print('the', fun.__name__, 'result:', fun())
		        print('extra:', datetime.datetime.now())
		
		    return inner
		
	# 例4:	
		def outer(func):
		    def inner():
		        print('executed:', func())
		    return inner
		
		@outer
		def fun1():
		    return 'this is fun1 function--'
		
		fun1()
		print(type(fun1))
	
		# 运行结果
		executed: this is fun1 function--
		<class 'function'>
	
	# 例5:
		#定义函数:完成包裹数据
		def makeBold(fn):
		    def wrapped():
		        return "<b>" + fn()
		    return wrapped
		
		#定义函数:完成包裹数据
		def makeItalic(fn):
		    def wrapped():
		        return "<i>" + fn()
		    return wrapped
		
		@makeBold
		def test1():
		    return "hello world-1"
		
		@makeItalic
		def test2():
		    return "hello world-2"
		
		@makeBold
		@makeItalic
		def test3():
		    return "hello world-3"
		
		print(test1())
		print(test2())
		print(test3())
		
		# 结果
		<b>hello world-1
		<i>hello world-2
		<b><i>hello world-3

异常处理:try…except…、try…except…else…、try…finally…、手动抛出异常raise

# 捕获并处理异常对象,后续代码可以运行
	try:
	    a = never_named_value
	    print(int(a))
	except ValueError:  # 发生ValueError错误执行以下代码
	    print("Error: 函数参数传值错误")
	except NameError:  # 发生NameError错误执行以下代码
	    print("Error: 名称空间使用出错")
	else:
	    print('Everything is fine')
    print('end line')
    
	Error: 名称空间使用出错
	end line
	
# 手动抛出异常
	# 例1
	
		def addfunc(a,b):
		    if type(a)!=type(b):
		        raise ValueError('类别错误') #或者 raise ValueError,'Invalid value'
		    return a+b
		addfunc(5,'f')
		
		# 执行结果
		Traceback (most recent call last):
		  File "D:\software\anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 2881, in run_code
		    exec(code_obj, self.user_global_ns, self.user_ns)
		  File "<ipython-input-16-b82082bcbeb3>", line 5, in <module>
		    addfunc(5,'f')
		  File "<ipython-input-16-b82082bcbeb3>", line 3, in addfunc
		  
	# 例2
	
		class design_wrong(Exception):              # Exception是父类
		    def __init__(self, length, atleast):
		        self.length = length
		        self.atleast = atleast
		
		def main():
		    try:
		        s = input('请输入 --> ')
		        if len(s) < 3:
		            # raise引发一个你定义的异常
		            raise design_wrong(len(s), 3)
		    except design_wrong as result:#这个变量被绑定到了错误的实例
		        print('ShortInputException: 输入的长度是 %d,长度至少应是 %d'%
		              (result.length, result.atleast))
		    else:
		        print('没有异常发生.')
		
		main()
		
		# 执行结果
		请输入 --> 4
		ShortInputException: 输入的长度是 1,长度至少应是 3

不定长位置参数,不定长关键字参数,偏函数

# 不定长位置参数
	# def myadd1(a,b,c,d,*parms):          # 一个*是元祖
	    print(type(parms))
	    print('parms:',parms)
	    print('a,b,c,d:',a,b,c,d)
	    return sum(parms)
	myadd1(1,2,3,4,5,6)
	
	<class 'tuple'>
	parms: (5, 6)
	a,b,c,d: 1 2 3 4
	Out[3]: 11
	
# 关键字参数
	#例1:
		def myadd0(args,lastnum=1000):   # 默认参数一定放在后面
	    	return args+lastnum
		myadd0(7)
		
		Out[5]: 1007
	
	#例2
		def myPrint(str, age):
		    print(str, age)
		
		#使用关键字参数
		myPrint(age = 18, str = "张三")
		
		Out[6]:张三 18

# 不定长关键字参数
	#例1
		def myadd(**kwargs):               # 2*是字典  
		    print(kwargs)
		myadd(add='sh', tel=13333)
		
		{'add': 'sh', 'tel': 13333}
		
	# 例2
		def person(name,age,**kw):
		    print('name:',name,'age:',age,'other:',kw)
		person('Frank','37')
		person('Frank','37',city='Shanghai')
		person('Frank','37',gender='M',job='Engineer')
		
		# 结果
		name: Frank age: 37 other: {}
		name: Frank age: 37 other: {'city': 'Shanghai'}
		name: Frank age: 37 other: {'gender': 'M', 'job': 'Engineer'}		
	
	
# 综合使用(不定长位置参数,不定长关键字参数)
	def myfun1(*args,**kwargs):
	    print(args)
	    for item in kwargs:
	         print(item)
	d1={'name':'david','add':'bj','date':'2018-8-1'}
	l1=[1,2,3,4,5,6,7]
	myfun1(*l1,**d1)

	(1, 2, 3, 4, 5, 6, 7)
	name
	add
	date
	
# 偏函数
	def mysal(nums,rate=2):
	    return nums*rate
	mysal(5)
	import functools
	rmb2jpn=functools.partial(mysal,rate=4)
	rmb2jpn(7)
	
	Out[16]: 28
	
# local(),返回一个局部name space,用dictionary表示 
# 函数内部定义的参数只在内部有效
    b=2
	def a():
	    f = 15
	    b = 34
	    print(locals())
	a()
	
	{'b': 34, 'f': 15}
	b
	Out[17]:2

函数

匿名函数,回调函数,高阶内置函数

# 匿名函数
	def a(x,y):
		return x+y
	a(2,3)
	Out[73]: 5
	
	# 可以写成
	a = lambda x,y:x+y
	a(2,3)
	Out[74]: 5
	
# 匿名函数作为参数传递
	def fun(a, b, opt):
	    print('a=', a)
	    print('b=', b)
	    print('result=', opt(a, b))
	fun(1, 2, lambda x, y: x + y)
	
	a= 1
	b= 2
	result= 3
	
# 回调函数	
	# 定义:
	
	# 回调函数就是一个通过函数指针调用的函数。
	# 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数
	
	
	# 回调函数1
	# 生成一个2k形式的偶数
	def double(x):
	    return x * 2
	
	# 回调函数2
	# 生成一个4k形式的偶数
	def quadruple(x):
	    return x * 4
	
	# 中间函数
	# 接受一个生成偶数的函数作为参数
	# 返回一个奇数
	def getOddNumber(k, getEvenNumber):
	    return 1 + getEvenNumber(k)
	
	
	# 起始函数,这里是程序的主函数
	def main():
	    k = 1
	    # 当需要生成一个2k+1形式的奇数时
	    i = getOddNumber(k, double)
	    print(i)
	    # 当需要一个4k+1形式的奇数时
	    i = getOddNumber(k, quadruple)
	    print(i)
	    # 当需要一个8k+1形式的奇数时
	    i = getOddNumber(k, lambda x: x * 8)
	    print(i)
	main()


# 高阶内置函数
	# map
		map?
		Init signature: map(self, /, *args, **kwargs)
		Docstring:     
		map(func, *iterables) --> map object
		Make an iterator that computes the function using arguments from
		each of the iterables.  Stops when the shortest iterable is exhausted.
		Type:           type
	
		# map映射,它的类型是map,用list转换成列表方式查看
		l1=[1,2,3,4,5,6,7]
		l2=[7,8,9,10,11,12,13]
		type(map(lambda x,y:x+y,l1,l2))
		Out[79]: map
		list(map(lambda x,y:x+y,l1,l2))
		Out[78]: [8, 10, 12, 14, 16, 18, 20]
		
	# reduce
		from functools import reduce
		reduce?
		
		Docstring:
		reduce(function, sequence[, initial]) -> value
		Apply a function of two arguments cumulatively to the items of a sequence,
		from left to right, so as to reduce the sequence to a single value.
		For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
		((((1+2)+3)+4)+5).  If initial is present, it is placed before the items
		of the sequence in the calculation, and serves as a default when the
		sequence is empty.
		
		# 例:
		from functools import reduce
		l1 = [1,2,3,4]
		reduce(lambda x,y:x+y,l1)
		Out[84]: 10
	# filter:按照给定条件过滤
		l1 = [1,2,3,4]
		list(filter(lambda x:True if x<3 else False,l1))
		
		Out[86]: [1, 2]

高阶函数

map
定义: map() 会根据提供的函数对指定序列做映射。
语法 map() 函数语法: map(function, iterable, ...)
map方法的描述:创建一个迭代器,使用每个迭代项。当最短的迭代被耗尽时停止。
参数
    function -- 函数,有两个参数
    iterable -- 一个或多个序列 
返回值: Python 2.x 返回列表。 Python 3.x 返回迭代器。
参数function传的是一个函数名,可以是python内置的,也可以是自定义的。 参数iterable传的是一个可以迭代的对象,例如列表,元组,字符串这样的。
这个函数的意思就是将function应用于iterable的每一个元素
#将单个字符转成对应的字面量整数
def chr2int(chr):
    return {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}[chr]
list1 = ["2","1","6","5"]
res = map(chr2int, list1)

print(res)
print(list(res))

<map object at 0x0000002F5BFA2F98>
[2, 1, 6, 5]

reduce
方法的描述:
将两个参数的函数累加到序列的项中,从左到右,以便将序列减少到单个值。
例如,减少(lambda x,y:x+y,[1, 2, 3,4, 5 ])计算
(((1+2)+3)+4+5)。如果初始存在,则放置在项目之前。
在计算中的顺序,当默认为序列

函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:
用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
格式:
reduce(function, iterable[, initializer])
参数说明:
    function -- 函数,有两个参数
    iterable -- 可迭代对象
    initializer -- 可选,初始参数
注意:一个函数作用在序列上,这个函数必须接受两个参数,reduce把结果继续和序列的下一个元素
累计运算
返回值:返回函数计算结果

例1:计算序列之和

from functools import reduce
aa=reduce(lambda x,y:x+y,[1,2,3,4,5])
print(aa)

15
例2:获取每个词出现的次数(以空格分割)

# 获取每个词出现的次数(以空格分割)
from functools import reduce
str="an apple a banana three apple a desk"
list=str.split(' ')
def fun(x,y):
    if y in x:
        x[y]=x[y]+1
    else:
        x[y]=1
    return x
result=reduce(fun,list,{}) # 第三个参数为初始值, 第一次,初始字典为空,作为fun的第一个参数
print(result)

{‘an’: 1, ‘apple’: 2, ‘a’: 2, ‘banana’: 1, ‘three’: 1, ‘desk’: 1}

例3:将字符串转成对应字面量数字

#将字符串转成对应字面量数字

from functools import reduce
def str2int(str):
    def fc(x, y):
        return x * 10 + y
    def fs(chr):
        return {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9}[chr]

    a = map(fs, list(str))
    # print(list(a))
    # print(type(a))
    return reduce(fc, a)


a = str2int("12")
print(a)
print(type(a))
filter
"""
定义:
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

方法的描述:
返回一个迭代器,为其生成函数(项)的可迭代项是真的。如果函数为“否”,则返回真实的项。

该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,
然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
语法

格式:
filter(function, iterable)

参数
    function --参数1为函数 判断函数。
    iterable --参数2为序列 可迭代对象。
'''

原型:filter(fn, lsd)

功能:用于过滤序列
白话文:把传入的函数依次作用与序列每个元素,根据返回的是True还是False决定是否保留该元素
"""

例1

#案例:筛选指定的元素
list1 = [1,2,3,4,5,6,7,8,9]
#筛选条件
def func(num):
    #偶素保留
    if num%2 == 0:
        return True
    #奇数剔除
    return False
l = filter(func, list1)
print(list(l))   # [2, 4, 6, 8]
print(list1)     # [1, 2, 3, 4, 5, 6, 7, 8, 9]

例2

data= [["姓名","年龄","爱好"],["tom", 25, "无"],["hanmeimei", 26, "金钱"]]
def func2(v):
    v = str(v)
    if v == "无":
        return False
    return True
for line in data:
    m = filter(func2, line)
    print(list(m))

[‘姓名’, ‘年龄’, ‘爱好’]
[‘tom’, 25]
[‘hanmeimei’, 26, ‘金钱’]

sorted
"""
定义:
sorted() 函数对所有可迭代的对象进行排序操作。

    sort 与 sorted 区别:
    sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
    list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

格式:
sorted(iterable[, cmp[, key[, reverse]]])

参数说明:
    iterable -- 可迭代对象。
    cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
    key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
    reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

返回值:
返回重新排序的列表。

"""

升序,降序

# 普通排序
list1 = [4,7,2,6,3]
list2 = sorted(list1)#默认升序排序
print(list2)


# 按绝对值大小排序
list3 = [4,-7,2,6,-3]
#key接受函数来实现自定义排序规则
list4 = sorted(list3, key=abs)
print(list4)


# 降序
list5 = [4,7,2,6,3]
list6 = sorted(list5, reverse=True)#默认升序排序
print(list6)

# 函数可以自己写
def myLen(str):
    return len(str)
list7 = ['b333','a1111111','c22','d5554']
list8 = sorted(list7,key=myLen)#默认升序排序
print(list8)
选择排序

在这里插入图片描述
最小值放第一个

# 选择排序法:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放到序列的起始位置,直到全部排完。

x = [6, 3, 2, 7, 4, 9, 5]
xLen = len(x)

for i in range(xLen - 1):
    min = i     # 第一轮先假定最小值索引为0
    # 遍历完成之后,min就指向了最小元素的下标
    for j in range(i + 1, xLen):
        if x[min] > x[j]:
            min = j    # 最小值的索引号

    # 把将最小的元素值和坐标为i的元素值进行交换
    x[i], x[min] = x[min], x[i]

print(x)

最大值放最后

# 选择排序法:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放到序列的起始位置,直到全部排完。
x = [6, 3, 2, 7, 4, 9, 5]
xLen = len(x)

# range(start, stop, step])
for i in range(xLen - 1, 0, -1):
    m = 0
    for j in range(1, i + 1):
        if x[j] > x[m]:
             m = j

    x[m],x[i] = x[i],x[m]

print(x)
冒泡排序
# 冒泡法:第一趟:相邻的两数相比,大的往下沉。最后一个元素是最大的。
# 第二趟:相邻的两数相比,大的往下沉。最后一个元素不用比。
x = [6, 3, 2, 7, 4, 9, 5]
xLen = len(x)

for i in range(len(x) - 1, 0, -1):
    for j in range(i):
        if x[j] > x[j + 1]:
            x[j + 1], x[j] = x[j], x[j + 1]
print(x)

LEGB

在这里插入图片描述

# LEGB
	# L:先找外函数中的内函数的valuel ,
	# E:如果找不到内函数的valuel就找外函数中,
	# G:如果再找不到,就找global,
	# B:最后找不到就到__builtins__中找valuel

    # 例:
	# 分别定义位于LEGB四个不同作用的,相同名字value1的变量
	__builtins__.value1 = 'B value stored in __builtins__'  # B
	value1 = 'G value stored in Global'                     # G

	
	# 而当出现嵌套函数inner时,也会新产生一个locals(),而如果inner此时还引用了在outter这个函数作用域内出现的变量时,就是闭包
	def outter():
		# Values store in Enclosure,称为闭包
	    value1 = 'E value stored in enclosure'              # E
	
	    def inner():
	        value1 = 'L value stored in locals'             # L
	        print(value1)  # 此时的value1是inner1这个函数外层函数的变量
	
	    return inner
	
	
	outter()()

面向对象:类,继承,类实例对象,类对象

下划线

在这里插入图片描述

# isinstance
	isinstance(7,int)
	Out[88]: True

# 类
	# 例1'''
		BMW = Car(),通过BMW来访问属性或者方法
		表示给BMW这个对象添加属性,BMW.color = '黑色',如果后面再次出现BMW.color = xxx表示对属性进行修改
		BMW是一个对象,它拥有属性(数据)和方法(函数)
		'''
		
		# 定义类
		class Car:
		    # 移动
		    def move(self):
		        print('车在奔跑...')
		
		
		# 创建一个对象,并用变量BMW来保存它的引用
		BMW = Car()
		BMW.color = '黑色'      # 添加类的属性,color和wheelNum
		BMW.move()
		print(BMW.color)

		# 运行结果
		车在奔跑...
		黑色

	# 例2:
		# 学生类设计
		# 总学生的人数,全部学生的姓名,已经毕业的学生的数量
		# 考试功能,分数大于60分,pass,,计入总分,否则 fail
		# 查分功能,如果考试次数
		# 查所有已经毕业学员的姓名。
		
		
		class Student():                       # 这里的()可有可无
		
		    # 类成员变量
		    student_total = 0                  # 学生总人数
		    student_namelist = []              # 学生名字list
		    student_graduated_name_list = []   # 符合毕业要求的学生名字list
		    
		    # 初始化函数,调用类时,自动运行初始化
		    def __init__(self, name, age, gender):
		        self.name = name
		        self.age = age
		        self.gender = gender
		
		        self.totalscore = 0                      # 总分数
		        self.times = 0                           # 考试次数
		        Student.student_total += 1               # 人数
		        Student.student_namelist.append(name)    # 名字集合
		
		    def exam(self, score):  # def函数在类中定义叫方法method,以和类外部定义的函数区分
		
		        if score < 60:
		            print('sorry,better luck next time!')
		        else:                                  # 如果超过60分
		            self.times += 1                    # 考试次数加一
		            self.totalscore += score           # 考试成绩累加
		            if self.times >= 2:
		                Student.student_graduated_name_list.append(self.name)
		
		
		
		    @classmethod                                    # 类方法
		    def get_graducated_student_list(cls,):          # 第一个参数一定是cls
		        return Student.student_graduated_name_list  # 返回类成员变量
		
		
		# 以下为执行文件
		zhangsan = Student('zhangsan', 23, 'male')   # 创建一个类对象,通过对象访问
		lisi = Student('lisi', 24, 'female')
		
		print('..........................................................')
		print(zhangsan.age)                      # 张三年纪
		
		print('..........................................................')
		print(Student.student_namelist)          # 名字集合
		print(Student.student_total)             # 学生人数
		
		print('..........................................................')
		one = zhangsan.exam(80)                      # 张三第一次成绩
		two = zhangsan.exam(85)                      # 张三第一次成绩
		print(zhangsan.times, zhangsan.totalscore)   # 打印zhangsan考试次数及总分数
		
		print('..........................................................')
		print(Student.get_graducated_student_list())
	
		# 执行结果
		..........................................................
		23
		..........................................................
		['zhangsan', 'lisi']
		2
		..........................................................
		2 165
		..........................................................
		['zhangsan']

继承

# 继承
	# 单继承
		"""
		说明:
		
		    虽然子类没有定义__init__方法,但是父类有,所以在子类继承父类的时候这个方法就被继承了,
		    所以只要创建Bosi的对象,就默认执行了那个继承过来的__init__方法
		总结
		    子类在继承的时候,在定义类时,小括号()中为父类的名字
		    父类的属性、方法,会被继承给子类
		"""
		
		
		# 定义一个父类,如下:
		class Cat(object):
		
		    def __init__(self, name, color="白色"):
		        self.name = name
		        self.color = color
		
		    def run(self):
		        print("%s--在跑" % self.name)
		
		
		# 定义一个子类,继承Cat类如下:
		class Bosi(Cat):
		
		    def setNewName(self, newName):
		        self.name = newName
		
		    def eat(self):
		        print("%s--在吃" % self.name)
		
		
		bs = Bosi("印度猫")
		print('bs的名字为:%s' % bs.name)
		print('bs的颜色为:%s' % bs.color)
		bs.eat()
		bs.setNewName('波斯')
		bs.run()
		
		# 运行结果
		bs的名字为:印度猫
		bs的颜色为:白色
		印度猫--在吃
		波斯--在跑

		
	
	# 多继承
		"""
		所谓多继承,即子类有多个父类,并且具有它们的特征
		"""
		#Python中多继承的格式如下:
		# 定义一个父类
		class A:
		    def printA(self):
		        print('----A----')
		
		# 定义一个父类
		class B:
		    def printB(self):
		        print('----B----')
		
		# 定义一个子类,继承自AB
		class C(A,B):
		    def printC(self):
		        print('----C----')
		
		obj_C = C()      # 此处()一定要有,因为obj_C.printA()使用类实例对象调用的是obj_C的成员函数。如果没有的话,报错如下
		# printA() missing 1 required positional argument: 'self'
		print(C())       # C()C类的一个实例化对象
		print(C)         # C相当于指向了C类

		obj_C.printA()
		obj_C.printB()
		
		# 运行结果
		<__main__.C object at 0x000000625E30C860> 
		<class '__main__.C'>
		----A----
		----B----

类实例对象与类对象访问实例变量的区别

# 类属性
	class People(object):  # (object)可有可无
	    name = 'Tom'       #公有的类属性
	    __age = 12         #私有的类属性
	
	p = People()           # 此处()可有可无,因为class里面只有类成员变量。
	
	print(p.name)
	print(People.name)
	print(p.__age)             # 不能调用私有属性
	print(People.__age)        # 不能调用私有属性
	
# 实例属性
	class People(object):
	    address = '山东'               # 类成员变量/类属性
	    def __init__(self):
	        self.name = 'xiaowang'    # 实例变量/实例属性
	        self.age = 20 
	
	p = People()      # 创建一个类的示例对象
	p.age =12
	print(p.address)  # 类的实例对象可以访问类成员变量,实例变量
	print(p.name)
	print(p.age)
	
	print(People.address)       # 类对象能调用类成员变量
	print(People.name)          # 类对象调不了实例变量
	print(People.age)

描述符

在这里插入图片描述

#@property—把函数调用伪装成对属性的访问,数据描述符属性的优先级高于实例名称空间中的同名成员。
# 使用@property,不用再像java中使用getter,setter方法去设置和访问类变量   
# 这时,也只有通过@property,才能对实例变量进行访问或设置,实现了对变量访问的控制,

class Student1():
    def __init__(self,name,age):  ###__init__实例初始化
        self.name = name       ####self:实例变量,变量的名字叫name
        self.__age=age
        
    @property #getter
    def name1(self):
        return self.name
    
    @name1.setter  # setter
    def name1(self,newname):
        self.name = newname
        
    @property #getter
    def age(self):
        return 0
    
    @age.setter  # setter
    def age(self,newage):
        self.__age = newage
        
# 上面这样设置的是类变量可以被类实例随意访问,修改。
# 注意,这里的name1,如果和实例变量name重名会导致,无限递归!!!
# RecursionError: maximum recursion depth exceeded while calling a Python object

# 但如果想让@property和类实例变量同名呢?  
# 将实例变量设置为私有(像age一样)就不会导致重名引发递归死机了
s1=Student1('jack',33)
s1.name1

s1.age        #getter
s1.age=22     #setter

s1.age

类工厂函数

#Namedtuple,类工厂函数
from collections import namedtuple

# 定义一个namedtuple类型User(实际是User类),并包含name,sex和age属性。
User = namedtuple('User', ['name', 'sex', 'age'])

# 创建一个User类的实例user
user = User(name='kongxx', sex='male', age=21)

# 也可以通过一个list来创建一个User对象
user = User._make(['kongxx', 'male', 21])

print(user)
# User(name='user1', sex='male', age=21)

# 获取用户的属性
print(user.name)
print(user.sex)
print(user.age)

# 修改对象属性,注意要使用"_replace"方法
user = user._replace(age=22)
print(user)

# 将User对象转换成字典,注意要使用"_asdict"
print(user._asdict())  # OrderedDict([('name', 'kongxx'), ('sex', 'male'), ('age', 22)])

元类

在这里插入图片描述
内置函数type()除了查看对象所属类型外,还有种非凡的能力,即能抛开固化的类创建代码,而动态的创建类。
而且通过type()函数创建的类和直接写class是完全一样的。
因为解释器遇到class关键字时,扫描一下class定义的语法,最后还是调用type()函数创建出class

#type()函数依次传入3个参数:
# 1.class的名称
# 2.class继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
# 3.class的方法名称与函数绑定,这里我们把函数fn绑定到方法名hello上。

# MyShinyClass = type('MyShinyClass', (), {})
# Foo = type('Foo', (), {'bar':True})
# FooChild = type('FooChild', (Foo,), {})

s1=dict(locals())
Foo = type('Foo', (), s1)
FooChild = type('FooChild', (Foo,), s1)
print(FooChild.__mro__)

文件操作:文件打开、关闭、读写、定位读写,重命名,删除

# 文件打开
	f = open('test.txt', 'w')
	说明: 访问模式 说明 r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
	
	w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
	
	a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到
	
	已有内容之后。如果该文件不存在,创建新文件进行写入。
	
	rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
	
	wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
	
	ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,
	
	新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
	
	r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
	
	w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
	
	a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。
	
	如果该文件不存在,创建新文件用于读写。
	
	rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
	
	wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
	
	ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。
	
	如果该文件不存在,创建新文件用于读写。
	
# 文件关闭
	f = open('test.txt', 'w')
	f.close()
	
# 文件写
	#使用write()可以完成向文件写入数据
	f = open('test.txt', 'w')
	f.write('hello world, i am here!')
	f.close()
	"""
	注意:
	    如果文件不存在那么创建,如果存在那么就先清空,然后写入数据
	"""   
# 文件读
	# 读文件三大方法:
	# read()        一个一个读,全部读完
	# read(n)       读取前n个
	# readline()    按行读
	# readlines()   全部读

	# read()方法
		# 写文件
		f = open('test.txt', 'w')   # 如果没有,就创建一个文件
		f.write('hello world, \ni am here!')
		f.close()
		
		#读文件,read()函数
		# 如果前面有read()或read(5),会接着读,而不是重新读
		f = open('test.txt', 'r')
		content1 = f.read(5)
		print(content1)
		
		print("-"*30)
		content2 = f.read()
		print(content2)
		f.close()
		
		# 执行结果:
		hello
		------------------------------
		 world, 
		i am here!

		
	# readlines()方法
	
		# 写文件
		f = open('test.txt', 'w')   # 如果没有,就创建一个文件
		f.write('hello world, \ni am here!')
		f.close()
		
		# 读文件
		f = open('test.txt', 'r')
		content = f.readlines()
		print(content)
		print(type(content))
		
		i=1
		for temp in content:
		    print("%d:%s"%(i, temp))
		    i+=1
		f.close()
		
		# 执行结果
		['hello world, \n', 'i am here!']
		<class 'list'>
		1:hello world,
		
		2:i am here!
		
	# readline()方法	
		# 写文件
		f = open('test.txt', 'w')   # 如果没有,就创建一个文件
		f.write('hello world, \ni am here!')
		f.close()
		
		#readline()
		f = open('test.txt', 'r')
		content = f.readline()
		print(content)
		f.close()
		
		# 执行结果
		hello world, 
		
# 文件定位读写

	"""
	seek(offset, from)2个参数
	    offset:偏移量
	    from:方向
	        0:表示文件开头
	        1:表示当前位置
	        2:表示文件末尾
	"""
	#把位置设置为:从文件开头,偏移5个字节
	# 打开一个已经存在的文件
	f = open("test.txt", "r")
	str = f.read(5)
	print ("读取的数据是 : ", str)
	
	# 查找当前位置
	position = f.tell()
	print ("当前文件位置 : ", position)
	
	# 重新设置位置
	f.seek(7,0)
	# 查找当前位置
	position = f.tell()
	print ("当前文件位置 : ", position)
	f.close()
				
    # 运行结果
    读取的数据是 :  hello
	当前文件位置 :  5
	当前文件位置 :  7
	
# 文件重命名
	import os
	os.rename("test.txt", "haha.txt")
	
# 文件删除
	import os
	os.remove("haha.txt")

文件夹操作:创建文件夹,获取当前目录,获取目录列表,删除文件夹(os模块)

# 创建文件夹
	import os
	os.mkdir("张三")
# 获取当前目录
	import os
	os.getcwd()
# 获取目录列表
	import os
	print(os.listdir("./"))
	# 执行结果
	['.idea', '1.py', '张三']
# 删除文件夹
	import os
	os.rmdir("张三")

PIL库

参考:https://blog.csdn.net/figo8875/article/details/88755122

生成一张固定尺寸固定颜色的图片

在这里插入图片描述

# 生成一张固定尺寸固定颜色的图片
from PIL import Image

# 获取一个Image对象,参数分别是: RGB模式,150,高30,红色
image = Image.new('RGB', (150, 30), 'red')

# 保存到硬盘,名为test.png,格式为png的图片
# wb,以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件
image.save(open('test.png', 'wb'), 'png')

生成一张随机颜色的图片

# 生成一张随机颜色的图片

from PIL import Image
import random


def getRandomColor():
    # 获取一个随机颜色(r,g,b)格式的

    c1 = random.randint(0, 255)
    c2 = random.randint(0, 255)
    c3 = random.randint(0, 255)

    return (c1, c2, c3)


# 获取一个Image对象,参数分别是RGB模式。宽150,高30,随机颜色
image = Image.new('RGB', (150, 30), getRandomColor())

# 保存到硬盘,名为test.png格式为png的图片
image.save(open('test.png', 'wb'), 'png')

生成一张带有固定字符串的随机颜色的图片

在这里插入图片描述

from PIL import Image

from PIL import ImageDraw

from PIL import ImageFont

import random


def getRandomColor():
    '''获取一个随机颜色(r,g,b)格式的'''

    c1 = random.randint(0, 255)

    c2 = random.randint(0, 255)

    c3 = random.randint(0, 255)

    return (c1, c2, c3)


# 获取一个Image对象,参数分别是RGB模式。宽150,高30,随机颜色
image = Image.new('RGB', (150, 30), getRandomColor())

# 获取一个画笔对象,将图片对象传过去
# 创建一个可用来对image进行操作的对象。对所有即将使用ImageDraw中操作的图片都要先进行这个对象的创建
draw = ImageDraw.Draw(image)

# 获取一个font字体对象,参数:是ttf的字体文件的目录,字体的大小
#  ImageFont.truetype(filename , wordsize)
#  这个函数创建字体对象给ImageDraw中的text函数使用。
font = ImageFont.truetype('simhei.ttf', size=25)

# 在图片上写东西,参数是:定位,字符串,颜色,字体
draw.text((12, 1), '我是字符串', getRandomColor(), font=font)

# 保存到硬盘,名为test.png格式为png的图片
image.save(open('test.png', 'wb'), 'png')

生成一张带有随机字符串随机颜色的图片

在这里插入图片描述

# 生成一张带有随机字符串随机颜色的图片

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import random


def getRandomColor():
    '''获取一个随机颜色(r,g,b)格式的'''

    c1 = random.randint(0, 255)
    c2 = random.randint(0, 255)
    c3 = random.randint(0, 255)

    return (c1, c2, c3)


def getRandomStr():
    '''获取一个随机字符串,每个字符的颜色也是随机的'''
    # 0~9的数字
    random_num = str(random.randint(0, 9))

    #利用random.randint()函数生成一个随机整数a,使得97<=a<=122
    #chr,对应从a到z的ASCII码
    # 小写字母
    random_low_alpha = chr(random.randint(97, 122))

    # 大写字母
    random_upper_alpha = chr(random.randint(65, 90))

    # choice(seq): 从seq序列中(可以是列表,元组,字符串)随机取一个元素返回
    random_char = random.choice([random_num, random_low_alpha, random_upper_alpha])

    return random_char


# 获取一个Image对象,参数分别是RGB模式。宽150,高30,随机颜色
image = Image.new('RGB', (150, 30), getRandomColor())

# 获取一个画笔对象,将图片对象传过去
draw = ImageDraw.Draw(image)

# 获取一个font字体对象参数是ttf的字体文件的目录,以及字体的大小
font = ImageFont.truetype("simhei.ttf", size=26)

for i in range(4):
    # 循环4次,获取4个随机字符串
    random_char = getRandomStr()

    # 在图片上一次写入得到的随机字符串,参数是:定位,字符串,颜色,字体
    draw.text((15 + i * 30, 0), random_char, getRandomColor(), font=font)

# 保存到硬盘,名为test.png格式为png的图片
image.save(open('test.png', 'wb'), 'png')

生成一张模糊的随机数字4位验证码图片

from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random


def getCaptcha(width=40, height=30, n=4, line=0):
    # 随机字母
    def rndNum():
        return str(random.randint(1, 9))

    # 为画布随机颜色
    def rndColor():
        return (random.randint(100, 255), random.randint(100, 255), random.randint(100, 255))

    # 为字体随机颜色
    def rndColor2():
        return (random.randint(30, 120), random.randint(30, 120), random.randint(30, 120))

        # 创建图片对象

    image = Image.new('RGB', (width, height), (255, 255, 255))

    # 创建Font对象
    font = ImageFont.truetype('arial.ttf', 36)

    # 创建Draw对象
    draw = ImageDraw.Draw(image)

    # 填充每个像素
    for x in range(width):
        for y in range(height):
            draw.point((x, y), fill=rndColor())

    # 输出文字
    for t in range(n):
        draw.text((40 * t + 10, 10), rndNum(), font=font, fill=rndColor2())

    # 模糊
    image = image.filter(ImageFilter.BLUR)
    image.save('verify.png', 'png')

getCaptcha(width=160, height=60, n=4, line=0)

正则表达式/Regular Expression

参考:https://blog.csdn.net/m0_37673307/article/details/81605053
正则表达式30分钟入门教程:https://deerchao.net/tutorials/regex/regex.htm
https://www.jianshu.com/p/04cb736fd375

规则

正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本
在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块,名字为re
re模块的使用过程:

# 导入re模块
import re
# 使用match方法进行匹配操作
result = re.match(正则表达式,要匹配的字符串)
# 如果上一步匹配到数据的话,可以使用group方法来提取数据
result.group()

说明:
re.match是用来进行正则匹配检查的方法,若字符串匹配正则表达式,则match方法返回匹配对象(Match Object),否则返回None(注意不是空字符串"")。
匹配对象Macth Object具有group方法,用来返回字符串的匹配部分。

正则表达式的字符功能:

. 匹配任意1个字符(除了\n)
[ ] 匹配[ ]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配单词字符,即a-z、A-Z、0-9、_
\W 匹配非单词字符

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

举例

用[1-9]?[0-9]这个正则去匹“09787787” 先判断第一个是不是0 ,如果是0 不符合【1-9】 到那时[1-9]?可以没有 所以 0再匹配后面【0-9】 符合 ,这时正则表达式匹配完成,字符串后面的就不管了。

用[1-9]?[0-9]这个正则去匹“892888” ,第一个是非0 满足【1-9】 条件,输出第一个 8。 再判断字符串第二个是不是满足[0-9] ,9满足条件输出9 ,所以最后是 89 ,字符串其余不管。

 # [1-9]?[1-9]表示匹配一个也行 两个也行
ret = re.match("[1-9]?[0-9]","09")
print(ret.group())  # 0

# [1-9][1-9] 表示必须匹配两个数字
ret = re.match("[0-9][0-9]","19332")
print(ret.group())#19

爬虫

HTML基础知识:https://www.w3cschool.cn/html/
CSS基础知识:https://www.w3cschool.cn/css/
使用requests获取网页内容
http://docs.python-requests.org/zh_CN/latest/user/quickstart.html

python刷题

输出200以内的可逆素数

# 思路:先找出素数,再找逆素数
# 素数:整数在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数
# 可逆素数是将某素数的各位数字顺序颠倒后仍为素数的数,请编程并输出200以内的可逆素数

numb = 200
for s in range(2, numb):

    for j in range(2,s):
        # 判断是否是素数
        if s%j == 0:
            break
    else:
        # 素数的前提下,判断是否是逆素数
        conv_s = int(str(s)[::-1])  # 将素数转换成字符串后颠倒再转换int

        for n in range(2, conv_s):
            if conv_s % n == 0:
                break
        else:
            print(s)

统计字符串中,各个字符的个数

# 统计字符串中,各个字符的个数
# 比如:"hello world" 字符串统计的结果为: h:1 e:1 l:3 o:2 d:1 r:1 w:1

W = 'hello world'
W = W.replace(' ', '')  # 去掉空格字符
dic = {}
for item in W:
    # 如果item在dic的key里,则对应item键的值加1
    if item in dic.keys():
        dic[item] += 1
    else:
        dic[item] = 1
print('"hello world" 字符串统计的结果为: ')
print(dic)

模拟斗地主,有3个玩家,一付扑克牌,留3张底牌, 将扑克牌随机分配给3个玩家并显示(注意有四种花色和两个王)

例1:

import random


class Poke():
    poke = []  # 扑克牌牌堆
    p1 = []  # 玩家一牌堆
    p2 = []  # 玩家二牌堆
    p3 = []  # 玩家三牌堆
    last = None  # 底牌牌堆

    def __init__(self, f, num):  # 初始化牌堆
        self.flower = f  # 花色
        self.num = num  # 点数

    def __str__(self):
        return "%s%s" % (self.flower, self.num)  # 返回牌值

    @classmethod
    def init(cls):  # 定义牌堆
        ph = ("♥", "♠", "♣", "♦")  # 花色元组
        pnum = ("2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A")  # 点数元组
        king = {"big": "大王", "small": "小王"}  # 大小王
        for p in ph:  # 循环遍历花色
            for _nump in pnum:  # 循环遍历点数
                # print(Poke(p, _nump))
                cls.poke.append(Poke(p, _nump))  # 装牌

        ################################################
        print(type(Poke.poke))  # <class 'list'>
        print(Poke.poke)        # 他是一个object

        for i in cls.poke:
            print(i, end=" ")
        print()
        ################################################

        # print(Poke(king["big"], ""))
        cls.poke.append(Poke(king["big"], ""))    # 装大王
        cls.poke.append(Poke(king["small"], ""))  # 装小王

    @classmethod
    def wash(cls):  # 洗牌
        random.shuffle(cls.poke)
        print(Poke.poke)

    @classmethod
    def send(cls):  # 发牌
        for _ in range(0, 17):  # 三个人每人发17张牌
            cls.p1.append(cls.poke.pop(0))  # 玩家一发牌 pop(0)是删除cls.poke的第一个数并返回第一个数

            cls.p2.append(cls.poke.pop(0))  # 玩家二发牌

            cls.p3.append(cls.poke.pop(0))  # 玩家三发牌

        cls.last = tuple(cls.poke)  # 最后三张牌做底牌

    @classmethod
    def show(cls):  # 展示牌
        print("玩家1:")
        for pokes in cls.p1:
            print(pokes, end=" ")
        print()

        print("玩家2:")
        for pokes in cls.p2:
            print(pokes, end=" ")
        print()

        print("玩家3:")
        for pokes in cls.p3:
            print(pokes, end=" ")
        print()

        print("底牌:")
        for pokes in cls.last:
            print(pokes, end=" ")
        print()


Poke.init()
Poke.wash()
Poke.send()
Poke.show()

例2

#斗地主
import random as R

"""一次一人发一张牌"""

L = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
H = ['♠', '♦', '♥', '♣']
w1 = []
w2 = []
w3 = []

P = ['大王', '小王']
for x in H:
    for y in L:
        s = x + y
        P.append(s)

R.shuffle(P)

i = 1
while i <= 17:
    w1.append(P.pop())
    w2.append(P.pop())
    w3.append(P.pop())
    i += 1

print('玩家1号')
print(w1)

print('玩家2号')
print(w2)

print('玩家3号')
print(w3)

print('底牌')
print(P)

执行结果:

玩家1号
[‘♦J’, ‘♠7’, ‘♥7’, ‘♠2’, ‘♣4’, ‘♠8’, ‘♦8’, ‘♣K’, ‘♦9’, ‘♥10’, ‘♠4’, ‘♣8’, ‘♦5’, ‘♥4’, ‘♥2’, ‘♠5’, ‘♣J’]
玩家2号
[‘♣A’, ‘♠3’, ‘♦Q’, ‘♣5’, ‘♥3’, ‘♥9’, ‘♥5’, ‘♣9’, ‘♠K’, ‘♦K’, ‘♠9’, ‘♦4’, ‘♥8’, ‘♥J’, ‘♣6’, ‘♣2’, ‘♦7’]
玩家3号
[‘♦10’, ‘♣3’, ‘♠6’, ‘♦3’, ‘♦A’, ‘♦6’, ‘♥6’, ‘♦2’, ‘♠J’, ‘♣Q’, ‘♥Q’, ‘♣10’, ‘♥A’, ‘♥K’, ‘大王’, ‘小王’, ‘♣7’]
底牌
[‘♠10’, ‘♠A’, ‘♠Q’]

设计一个公司类

'''
设计一个公司类,完成以下要求,并实例化不同对象进行验证

类变量
 - 类下公司的总个数,类下实例的名称列表

类方法
 - 返回公司类共有多少个公司实例
 - 返回公司类的公司实例有名称列表

实例变量
- 公司名,简介,利润,销售额,总成本,雇员姓名

实例方法:
- 招聘人才(每招一个人会有成本产生,影响该实例雇员列表,人数,总成本)
- 解雇人员(每解雇一个人会有成本产生,影响该实例雇员列表,人数 ,总成本)
- 公司广告推广(影响该实例总成本)
- 交社保(按公司雇员总人数计算,影响该实例总成本)
- 交税(按公司雇员总人数计算,影响该实例总成本)
- 销售(按销售件数*价格计算销售额,利润按销售额*利润率进行计算利润。)
- 获取公司雇员列表
- 获取公司净利润
'''


class Company():

    num = 0     # 公司的总个数
    name = []   # 实例的名称列表

    def __init__(self, Company_name, Desc,Profit, TotalSales, TotalCost, EmployeeName):

        # 实例变量: 公司名,简介,利润,销售额,总成本,雇员姓名
        self.Company_name = Company_name               # 公司名
        self.Desc = Desc                               # 简介
        self.Profit = Profit                           # 利润
        self.TotalSales = TotalSales                   # 销售额
        self.TotalCost = TotalCost                     # 总成本
        self.EmployeeName = EmployeeName               # 雇员姓名

        self.Employee_number = len(self.EmployeeName)  # 雇员数量
        Company.num += 1
        Company.name.append(Company_name)

    # 招聘人才(每招一个人会有成本产生,影响该实例雇员列表,人数,总成本)
    def recuitment(self, r_name, r_salary):
        self.EmployeeName.append(r_name)    # 雇员列表
        self.TotalCost += r_salary          # 总成本
        self.Employee_number += 1           # 雇员人数

    # 解雇人员(每解雇一个人会有成本产生,影响该实例雇员列表,人数 ,总成本)
    def fire(self, f_name, f_salary):
        self.EmployeeName.remove(f_name)    # 雇员列表
        self.TotalCost -= f_salary          # 总成本
        self.Employee_number -= 1           # 雇员人数

    # 公司广告推广(影响该实例总成本)
    def advertise(self, ad_cost):
        self.TotalCost += ad_cost           # 总成本

    # 交社保(按公司雇员总人数计算,影响该实例总成本)
    def s_security(self, s_cost):
        self.TotalCost += s_cost * self.Employee_number

    # 交税(按公司雇员总人数计算,影响该实例总成本)
    def tax(self, t_cost):
        self.TotalCost += t_cost * self.Employee_number

    # 销售(销售件数*价格 = 销售额,销售额*利润率 = 利润。)
    def sale(self, sale_number, profit_rate, price):
        self.TotalSales += sale_number * price             # 销售件数*价格 = 销售额
        self.Profit += sale_number * price * profit_rate   # 销售件数*价格*利润率 = 利润

    # 获取公司雇员列表
    def get_employee(self):
        return self.EmployeeName

    # 获取公司净利润
    def get_profit(self):
        return self.Profit

    # 装饰器:类方法
    @classmethod
    def get_num(cls):     # 返回公司类共有多少个公司实例
        return cls.num

    # 装饰器:类方法
    @classmethod
    def get_name(cls):    # 返回公司类的公司实例有名称列表
        return cls.name

def main():
    c = Company('C','Company C',0,12,12,['Feng','Zhang'])  # 公司名,简介,利润,销售额,总成本,雇员姓名
    c.recuitment('Gua', 4)    # 招聘人才     参数:人名,薪水
    c.fire('Feng', 3)         # 解雇人员     参数:人名,薪水
    c.advertise(0.5)          # 公司广告推广  参数:广告成本
    c.s_security(0.2)         # 交社保       参数:广告成本
    c.tax(0.1)                # 交税         参数:税成本
    c.sale(10,0.3,100)        # 销售         参数:销售件数,利润率,价格

    print('公司名字:', c.Company_name)
    print('总费用:', c.TotalCost)
    print('公司员工:', c.get_employee())

    # 类方法的调用
    print('公司名称:', Company.get_name())
    print('公司数量:', Company.num)


if __name__ == '__main__':
    main()

while循环完成图形输出

'''
使用while,完成以下图形的输出
*
* *
* * *
* * * *
* * * * *
* * * *
* * *
* *
*
'''

i = 0
while i <=5:
    j = 0
    while j <= i:
        print("*",end=" ")    # end值为空格
        j += 1
    print("")                 # end值为默认值(换行\n)
    i += 1
i = 4
while i >= 0:
    j = 0
    while j <= i:
        print("*",end=" ")
        j += 1
    print("")
    i -= 1

“名片管理器”项目

"""
 编写程序,完成“名片管理器”项目

    需要完成的基本功能:
        添加名片
        删除名片
        修改名片
        查询名片
        退出系统
    程序运行后,除非选择退出系统,否则重复执行功能
    
须使用自定义函数,完成对程序的模块化
学生信息至少包含:姓名、年龄、学号,除此以外可以适当添加
必须完成的功能:添加、删除、修改、查询(单个查询/显示所有)、退出   
"""
'''
学生信息系统:
要求: 用键盘录入的方式
根据序列完成:
   1. 添加一个新的名片")
   2. 删除一个名片")
   3. 修改一个名片")
   4. 查询一个名片")
   5. 显示所有的名片")
   6. 退出系统"
'''

# 用来存储名片
card_infors = []


def print_menu():
    """完成打印功能菜单"""
    print("=" * 50)
    print("   名片管理系统 V0.01")
    print(" 1. 添加一个新的名片")
    print(" 2. 删除一个名片")
    print(" 3. 修改一个名片")
    print(" 4. 查询一个名片")
    print(" 5. 显示所有的名片")
    print(" 6. 退出系统")
    print("=" * 50)


def add_new_card_infor():
    """完成添加一个新的名片"""
    new_name = input("请输入新的名字:")
    new_qq = input("请输入新的QQ:")
    new_weixin = input("请输入新的微信:")
    new_addr = input("请输入新的住址:")

    # 定义一个新的字典,用来存储一个新的名片
    new_infor = {}
    new_infor['name'] = new_name
    new_infor['qq'] = new_qq
    new_infor['weixin'] = new_weixin
    new_infor['addr'] = new_addr

    # 将一个字典,添加到列表中
    global card_infors
    card_infors.append(new_infor)

    # print(card_infors)     # for test


def del_card_infors():
    """用来删除一个名片"""
    global card_infors
    find_name = input("请输入要删除的姓名:")
    find_flag = 0

    for temp in card_infors:
        tem = 0
        if temp['name'] == find_name:
            print(card_infors)
            card_infors.pop(tem)
            find_flag = 1  # 表示找到了
            break
        tem += 1
    # 判断是否找到了
    if find_flag == 0:
        print("查无此人....")


def modif_card_infors():

    """用来修改一个名片"""
    global card_infors
    find_name = input("请输入要修改的姓名:")
    find_flag = 0

    for temp in card_infors:
        tem = 0
        if temp['name'] == find_name:
            print(card_infors)

            print("=" * 50)
            print("   请输入要修改的名片信息:")
            print(" 1. QQ")
            print(" 2. 微信")
            print(" 3. 住址")
            print(" 4. 临时不修改了")
            print("=" * 50)

            while True:

                # 获取用户的输入
                num = int(input("请输入要修改名片信息或退出对应的序号:"))

                # 根据用户的数据执行相应的功能
                if num == 1:              # QQ
                    new_qq = input("请输入新的QQ:")
                    temp['qq'] = new_qq

                elif num == 2:            # 微信
                    new_weixin = input("请输入新的微信:")
                    temp['weixin'] = new_weixin

                elif num == 3:            # 地址
                    new_addr = input("请输入新的住址:")
                    temp['addr'] = new_addr

                elif num == 4:            # 退出系统
                    break

                else:
                    print("输入有误,请重新输入")

                print("")


            find_flag = 1  # 表示找到了
            break
        tem += 1

    # 判断是否找到了
    if find_flag == 0:
        print("查无此人....")


def find_card_infor():
    """用来查询一个名片"""
    global card_infors

    find_name = input("请输入要查找的姓名:")
    find_flag = 0  # 默认表示没有找到

    for temp in card_infors:
        if find_name == temp["name"]:
            print("%s\t%s\t%s\t%s" % (temp['name'], temp['qq'], temp['weixin'], temp['addr']))
            find_flag = 1  # 表示找到了
            break

    # 判断是否找到了
    if find_flag == 0:
        print("查无此人....")


def show_all_infor():
    """显示所有的名片信息"""

    global card_infors

    print("姓名\tQQ\t微信\t住址")
    for temp in card_infors:
        print("%s\t%s\t%s\t%s" % (temp['name'], temp['qq'], temp['weixin'], temp['addr']))


def main():
    """完成对整个程序的控制"""
    # 1. 打印功能提示
    print_menu()

    while True:

        # 2. 获取用户的输入
        num = int(input("请输入操作序号:"))

        # 3. 根据用户的数据执行相应的功能
        if num == 1:
            add_new_card_infor()  # 添加名片

        elif num == 2:
            del_card_infors()     # 删除名片

        elif num == 3:
            modif_card_infors()   # 修改名片

        elif num == 4:
            find_card_infor()     # 查询名片

        elif num == 5:
            show_all_infor()      # 显示所有名片

        elif num == 6:
            break                 # 退出系统
        else:
            print("输入有误,请重新输入")

        print("")


# 调用主函数
main()
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值