python基础
2019-07-11 本文已影响0人
John_Phil
1.变量、2.运算符、3.分支与循环、4.列表与元组、5.字符串处理、6.字典与集合 、7.变量值与内存、8.函数
1.变量
# 单行注解使用井号
"""
三个双引号
或
三个单引号
为多行注释
"""
'''
三个双引号
或
三个单引号
为多行注释
'''
studentid='a123'
studentname='tom'
print("studentid:",studentid," studentname:",studentname)
price=50.5
weight=4.5
sum=price*weight
print("总价格为",price,"*",weight,"=",sum)
"""判断类型"""
a1=10
a2=10.5
a3=True
a4=False
a5="你好"
a6=[1,2,3,4,5,6,7,8,9]
a7=(1,2,3,4,5,6,7,8,9)
a8={'name':'tom','age':18}
a9={1,2,3,4,5,6,7}
print(type(a1))
print(type(a2))
print(type(a3))
print(type(a4))
print(type(a5))
# list相当于 java中的数组
print(type(a6))
# 元组属于不可变列表 此数据类型java中无对应类型
print(type(a7))
# 字典相当于java中的map集合
print(type(a8))
# 集合相当于java中的集合
print(type(a9))
# list与set区别
# 1.有序与无序 过后拓展******************
b1=10
b2=True
b3=False
print("10+True=",b1+b2)
print("10+False",b1+b3)
c1 = "aaaa"
c2 = "bbbb"
print(c1+c2)
c3 = 123
print(c1+str(c3))
print("a"*3)
d1 = "111"
d2 = "222"
d3 = "333.4"
print(d1+d2)
print(int(d1)+int(d2))
print(int(d1)+float(d3))
# 真假
e1 = 0.1
e2 = 0
print(bool(e1))
print(bool(e2))
# list tuple
f1 = "123456"
print(list(f1))
print(type(list(f1)))
print(tuple(f1))
print(type(tuple(f1)))
# dict set
f2 = "123"
f3 = '{"name":"yct","age":10}'
print(set(f1))
print(type(set(f1)))
# print(dict(f3))
# print(type(dict(f3)))
print(eval(f3))
print(type(eval(f3)))
# 练习
ap = input("apple price")
aw = input("apple weight")
print("总价为"+str(int(ap)*int(aw)))
# c风格输出 %类似java中的反斜杠 为转义字符 与c语言的输出格式类似
g1=10
g2=10.5
g3=True
g4="你好"
g5=[1,2,3,4,5,6]
g6="%"
print("g1 is %d g2 is %.2f g3 is %s g4 is %s g5 is %s g6 is %s and %% "%(g1,g2,g3,g4,g5,g6))
# format 字符串升级写法
print("format1 g1 is {} g2 is {} g3 is {} g4 is {} g5 is {} g6 is {} ".format(g1,g2,g3,g4,g5,g6))
print(f"format2 g1 is {g1} g2 is {g2} g3 is {g3} g4 is {g4} g5 is {g5} g6 is {g6}")
hname = input("请输入姓名:")
hcompany = input('公司名称')
hjob = input('请输入职位')
hemail=input('邮箱')
htel=input('电话')
print("*"*50)
print(hcompany+"\n")
print(f"{hname}({hjob})\n")
print(f"邮箱:{hemail}")
print(f"电话:{htel}")
print("*"*50)
2.运算符
a1=True
a2=False
a3=0
a4=1
a5=2
"""
与java不同的运算符
1除法自动得小数 想实现取整数 需要使用 //
2有乘方(幂) 符号为 **
"""
print("10**3=",10**3)
print("10/3=",10/3)
print("10//3=",10//3)
print(a1+a2)
print(a1==a2)
# 1 是true
print(a1==a4)#True
print(a1==a5)#False
# 取反在python中使用not 在java中使用 !
# True 不一定为1 非0 皆真
if(a5):
print(f"{a5} is True")
if(not a2):
print(f"{a2} is false")
# 逻辑运算符
'''
逻辑运算符与java不同处
1. 取反在python中使用not 在java中使用 !
2. 当为真假时为短路运算
3. 当为数字时
# 判断变量是否为0, 是0则为False,非0判断为True,
# and中含0,返回0; 均为非0时,返回后一个值,
2 and 0 # 返回0
2 and 1 # 返回1
1 and 2 # 返回2
# or中, 至少有一个非0时,返回第一个非0,
2 or 0 # 返回2
2 or 1 # 返回2
0 or 1 # 返回1
'''
print("False and 10/0:",False and 10/0)
print("1 and 0:",1 and 0)
print("0 and 2:",0 and 2)
print("1 and 2:",1 and 2)
print("0 or 2 or 3:",0 or 2 or 3)
print("1 and 2 or 3:",1 and 2 or 3)
print("3 or 1 and 2 :",3 or 1 and 2)
print("(3 or 1) and 2 :",(3 or 1) and 2)
print("1 & 2:",1 & 2)
print("1 | 2:",1 | 2)
3.分支与循环
a1=10
a2=20
"""
if条件与java使用方法一直,语法关键词稍有不同java else if ----python elif
python中无switch语句
"""
if a1==10:
print("*"*10+"a1==10")
if a1==15:
print("*"*10+"a==15")
else:
print("*"*10+"a!=15")
if a1==10:
print("*"*10)
elif a2==20:
print("#"*10)
elif a1==10 and a2==20:
print("^"*10)
"""
循环 与java逻辑一致
yujava不同点 当没有表达式时 java {} python pass
"""
# 1+2.....+100
b1=0
bsum1=0
while b1<=100:
bsum1=bsum1+b1
b1=b1+1
print(bsum1)
# 大于1000时终止
b2=0
bsum2=0
while b2<=100:
if bsum2>1000:
break
else:
bsum2=bsum2+b2
b2=b2+1
print(bsum2)
# 1+3+5.....99
b3=0
bsum3=0
while b3<=99:
if b3%2==0:
b3=b3+1
continue
elif 1==2:
pass
else:
bsum3=bsum3+b3
b3=b3+1
print("bsum3:"+str(bsum3))
"""
for 循环 与Java不同 类似java中的 foreach语句
for(in)
"""
# 遍历字符串
for n in "hello how are you":
print(n)
# 遍历数字 利用range(m,n)函数 其实m 共打印 n-m个 最大值为 n-1
for n in range(1,5):
print(n)
"""
9*9 算法表
1*1=1 k1=1 t1=1 规律: t1*k1
1*2=2 2*2=4 k1=2 t1=1 /t1=2
1*3=3 2*3=6 3*3=9 k1=3 t1=1/t1=2/t1=3
...
利用print 打印 自动换行 如果不想换行 使用 end="" 可以不换行
"""
for k1 in range(1,10): #行
for t1 in range(1,k1+1): #列
result=t1*k1
print(f"{t1}*{k1}={result}\t",end="")
print()
"""
随机生成数与java 不同 python随机生成的为左闭右闭 java 生成为随机数 左闭右开
"""
import random
# random.randint(a, b) ,返回 [a, b] 之间的整数,包含 a 和 b
k=1
while k<100:
n2 = random.randint(1, 10)
print(n2,end=",")
k=k+1
4列表与元组
"""
列表 list
与java中的ArrayList类似
写法与java数组类似
"""
al=[1,2,3,4,5,6,7,8]
# 遍历list
for n in al:
print(n)
# 字符串转 list
a2="hello how are you"
print(list(a2))
# list 转字符串
a3=['h', 'e', 'l', 'l', 'o', ' ', 'h', 'o', 'w', ' ', 'a', 'r', 'e', ' ', 'y', 'o', 'u']
a4=""
for n in a3:
a4=a4+n
print(a4)
# 删除list 及元素
del a3[0]
print(a3)
# del a3
# print(a3) //list已删除
# 列表元素处理 append添加到最后 insert 插入到其中 extend将list插入
# 以上为使用原地址进行拼接 -----原地操作
b1=[1,2]
print(b1)
b1.append(3333)
print(b1)
b1.insert(0,9)
print(b1)
b1.extend([7,6,5])
print(b1)
# list改变地址操作 即新生成地址 ----返回新列表
b2=[1,2]
print("br2:"+str(b2))
b3=b2+[3]
print("br3"+str(b3))
# pop 弹出栈尾 remove 删除指定位置元素(比index大一) clear 清空list del 删除指定下表index位置元素
b3=[1,2,3,4,5,6,7,8]
print(b3)
print(b3.pop())
print(b3)
print(b3.remove(1))#删除第一个
print(b3)
print(b3.clear())
print(b3)
b4=[1,2,3,4,5,6,7,8,1]
print(b4)
del b4[1]
print(b4)
# 列表访问技术 count计数 in判断是否有 in
print(b4.count(1))
# 判断是否有可以用两种方法 count为0 说明无 in 返回 bool
print(b4.count(9))
print(9 in b4)
# sort 排序
b5=[78,2,6,8,3,1,45,21,23]
print(b5.sort()) #默认升序
print(b5)
# 降序三种方法
# 方法一
# b5.sort(reverse=True)
# print(b5)
# 方法二
# b5.sort()
# # b5.reverse()
# print(b5)
# 方法三
# b5.sort()
# print(list(reversed(b5)))
# 返回可迭代的zip对象 用法后续拓展
# 返回带下表index的枚举对象
b6="hello"
b7=enumerate(list(b6))
print(b7)
for k in b7:
print(k)
# 遍历列表三种方式
b8=list(b6)
for k in b8:
print(k,end="")
print()
#range(0,n)与 range(n)等价
for k in range(len(b8)):
# for k in range(0,len(b8)):
print(b8[k],end="")
print()
# 遍历枚举类型多个参数值 第一个为下表 第二个参数为值
for i,ele in enumerate(b8):
print(f"{i} : {ele}")
'''
列表推导式 java中无此方法
lis = [i for i in range(100)]
print(lis)
result=[]
for i in range(100)
result.append(i)
'''
lis1 = [i for i in range(100)]
print(lis1)
result2=[]
for i in range(100):
result2.append(i)
print(result2)
'''
vec = [[1,2,3], [4,5,6], [7,8,9]]
list2=[num for elem in vec for num in elem]
result3=[]
相当于
for elem in vec:
for num in elem:
result3.append(num)
'''
vec = [[1,2,3], [4,5,6], [7,8,9]]
list2=[num for elem in vec for num in elem]
print(list2)
result3=[]
for elem in vec:
for num in elem:
result3.append(num)
print(result3)
# 过滤
# 将大于0的重新放到新数组里
'''
aList = [-1,-4,6,7.5,-2.3,9,-11]
list4 =[ n for n in aList if n>0 ]
相当于
result4=[]
for n in aList:
if n>0:
result4.append(n)
'''
aList = [-1,-4,6,7.5,-2.3,9,-11]
list4 =[ n for n in aList if n>0 ]
print(list4)
result4=[]
for n in aList:
if n>0:
result4.append(n)
print(result4)
"""
print([(x, y) for x in range(3) for y in range(3)])
list6=[]
for x in range(3):
for y in range(3):
list6.append((x,y))
"""
print([(x, y) for x in range(3) for y in range(3)])
list6=[]
for x in range(3):
for y in range(3):
list6.append((x,y))
print(list6)
"""
print([(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y])
list7=[]
for x in [1, 2, 3]:
for y in [3, 1, 4]:
if x != y
list7.append((x,y))
"""
print([(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y])
list7=[]
for x in [1, 2, 3]:
for y in [3, 1, 4]:
if x != y:
list7.append((x,y))
print(list7)
'''
解决冒泡排序问题
实现从小到大排序
'''
alist5 = [45,32,31,12,5,2,18,49,1]
for m in range(1,len(alist5)):
for n in range(0,len(alist5)-m):
if alist5[n]>alist5[n+1]:
temp= alist5[n]
alist5[n]=alist5[n+1]
alist5[n+1]=temp
print("alist5:"+str(alist5))
# 切片
'''
这里的索引与java不同 java无负值 python可以设置负值从右向左
python中的有序序列都支持切片,如字符串,元组,列表。
'''
colors = ["red", "blue", "green"]
print(colors[-1])
'''
li[start : end : step]
默认 step为1
如果不写前或尾 自动从前到尾
如果 右超出界限 自动到当前最大值
方向
step = 1
---------------------->
-4 -3 -2 -1
["A", "B", "C", "D"]
0 1 2 3
step=-1
<--------------------
[0,2]
从0开始 共2-0个元素
'''
li = ["A", "B", "C", "D"]
t=li[0:3] # ["A","B","C"] #起点的0索引可以省略,t=li[:3]
print(t)
t=li[2: ] # ["C","D"] #省略end,则切到末尾
print(t)
t=li[1:3] # ["B","C"]
print(t)
t=li[0:4:2] #$ ["A","C"] #从li[0]到li[3],设定步长为2。
print(t)
t=li[0:2]
print(t)
t=li[0:-2]
print(t)
t=li[-4:-2]
print(t)
t=li[-4:2]
print(t)
t=li[-1:-3:-1]
print(t) #d c
t=li[::-1] # t--->["C","B","A"] #反向切,切出全部
t=li[:] # t--->["A","B","C","D"] #正向切全部
# 使用切片来原地修改列表内容
alist6=[1,2,3,4,5,6]
# 后增加 7,8,9
alist6[len(alist6):]=[7,8,9]
print(alist6)
# 将前三个换为8,9
alist6[:3]=[8,9]
print(alist6)
# 删除前三个
# 方法一
alist6[:3]=[]
print(alist6)
#方法二
del alist6[:3]
print(alist6)
#删除偶数位的元素
alist7=[1,2,3,4,5,6,7,8,9,10]
del alist7[1::2]
print(alist7)
'''
浅层复制与深层复制问题后续拓展
https://baijiahao.baidu.com/s?id=1597371058109891101&wfr=spider&for=pc
'''
'''
元组 tuple 元组属于不可变序列(元素集合),一旦创建,
用任何方法都不可以修改其元素。从形式上,元组的所有元素放在一对 圆括 ()号中,
元素之间用逗号分隔。
'''
c1=(1,2,3,4,5,6)
print(tuple("hello")) #把字符串转换为元组
print(tuple(list("hello"))) #把列表转换为元组
5.字符串处理
'''
字符串操作
'''
#切片方法 同 list中的切片
s1 = 'www.neuedu.com'
print(s1[6: 10])
s2 = 'www.NEUEDU.com'
print(s2.upper()) #### 全部大写
print(s2.lower()) #### 全部小写
s3 = 'www.neuedu.com'
print(s3.startswith('www')) #### 判断是否以www开头
print(s3.endswith('com')) #### 判断是否以com结尾
#find找不到-1 index找不到报错
s4 = 'chhengt'
print(s4.find('h')) #### 通过元素找索引找到第一个就返回(可切片)
print(s4.find('b')) #### 找不到返回 -1
# print(s4.index('b')) #### 找不到会报错
s5 = 'qqwalex qqwusir barryy'
print(s5.strip('qqw'))
print(s5.strip(''))
print(s5.lstrip('yy'))
print(s5.rstrip('yy'))
# split 把字符串分割成列表
s61 = 'qqwalex qqwusir barryy'
s62 = 'qqwale;x qqwu;sir bar;ryy'
print(s61.split()) #### 默认以空格分割
print(s62.split(';')) #### 以指定字符分割
print(s62.split(';', 1)) #### 指定分割多少个
#列表转字符串 join
li = ['aa', 'ddj', 'kk']
print("".join(li))
print(",".join(li))
str=""
for n in li:
str=str+n;
print(str)
#### 字符串.isalnum() 所有字符都是数字或者字母,为真返回 Ture,否则返回 False。
#### 字符串.isalpha() 所有字符都是字母,为真返回 Ture,否则返回 False。
#### 字符串.isdigit() 所有字符都是数字,为真返回 Ture,否则返回 False。
#### 字符串.islower() 所有字符都是小写,为真返回 Ture,否则返回 False。
#### 字符串.isupper() 所有字符都是大写,为真返回 Ture,否则返回 False。
#### 字符串.istitle() 所有单词都是首字母大写,为真返回 Ture,否则返回 False。
#### 字符串.isspace() 所有字符都是空白字符,为真返回 Ture,否则返回 False。
#### is 系列
name = 'taibai123'
print(name.isalnum()) # True #### 字符串由数字或字母组成时返回真
print(name.isalpha()) # False #### 字符只由字母组成时返回真
print(name.isdigit()) # False #### 字符只由数字组成时返回真
#### count 计算字符串中某个字符出现的次数 ***
s = 'www.neuedu.com'
print(s.count('u'))
print(s.count('u', 7))
#replace
s = 'asdf 之一,asdf也,asdf'
#### replace ***
s1 = s.replace('asdf', '日天')
print(s1)
s1 = s.replace('asdf', '日天', 1)
print(s1)
#### format 格式化输出 ***
#### 第一种方式:
s = '我叫{}, 今年{}, 性别{}'.format('小五', 25, '女')
print(s)
#### 第二种方式
s1 = '我叫{0}, 今年{1}, 性别{2},我依然叫{0}'.format('小五', 25, '女')
print(s1)
#### 第三种方式
s2 = '我叫{name}, 今年{age}, 性别{sex},我依然叫{name}'.format(age=25, sex='女',name='小五')
print(s2)
#第四种方式
age=25
sex='男'
name='小浏览器'
s3=f'我叫{name}, 今年{age}, 性别{sex},我依然叫{name}'
print(s3)
s = 'chen wuang4fhsa¥fh。f'
#### capitalize() 首字母大写 **
s1 = s.capitalize()
print(s1)
#center() 将字符串居中可以设置总长度,可以设置填充物 * 默认空格填充
s = 'chenziwu'
s2 = s.center(50)
print(s2)
s2 = s.center(50, '*')
print(s2)
# title 非字母隔开的每个单词的首字母大写 *
s = 'chen wuang4fhsa¥fh。f'
#### title 非字母隔开的每个单词的首字母大写 *
s4 = s.title()
print(s4)
# 字符串是不可变变量,不支持直接通过下标修改
msg = 'abcdefg'
# msg[2] = 'z' //不可通过下表修改
msg = msg[:2] + 'z' + msg[3:]
print(msg)
6.字典与集合
"""
字典类型
相当于java中的map集合
"""
a_dict={"name":"tom","age":11}
print(a_dict["name"])
keys = ['a', 'b', 'c', 'd']
values = [1, 2, 3, 4]
print(zip(keys, values)) #元组压缩
# zip 转 dict
print(dict(zip(keys, values)))
print(type(dict(zip(keys, values))))
print(list(zip(keys, values)))
# list->tuple 转 dict
print(dict(list(zip(keys, values))))
#特殊写法 转 dict
d = dict(name='Dong', age=37)
print(d)
#list-> 紧有key的dict
print(dict.fromkeys(["username","password"]))
print(zip(*zip(keys, values))) #解压 回归二维矩阵
print(list(zip(*zip(keys, values))))
a1,b1=list(zip(*zip(keys, values)))
print(a1)
print(b1)
aDict = {'name':'Dong', 'sex':'male', 'age':37}
# aDict['name']键不存在,抛出异常
# 使用字典对象的get方法获取指定键对应的值,并且可以在键不存在的时候返回指定值。
print(aDict['name'])
print(aDict.get("name"))
# print(aDict['name1'])
print(aDict.get("name1","null"))
aDict={'age': 37, 'name': 'Dong', 'sex': 'male'}
aDict['score'] = aDict.get('score',[])
aDict['score'].append(98)
aDict['score'].append(97)
print(aDict)
# items()方法可以返回字典的键、值对列表
print(aDict.items()) # dict_items([('age', 37), ('name', 'Dong'), ('sex', 'male'), ('score', [98, 97])])
t1=('a','b','b');
for key in aDict: #不加特殊说明,默认输出键
print(key)
print(aDict.keys())
print(aDict.values())
# 使用字典对象的setdefault()方法返回指定“键”对应的“值”,如果字典中不存在该“键”,就添加一个新元素并设置该“键”对应的“值”
aDict ={'name' : 'Wang','sex' : 'male'}
aDict.setdefault('age','28')
print(aDict)
print(aDict.setdefault('age'))
print(aDict.setdefault('hobby'))
print(aDict)
#
aDict={'age': 38, 'name': 'Dong', 'sex': 'male'}
aDict['address'] = 'SDIBT' #增加新元素
print(aDict)
# 使用字典对象的update方法将另一个字典的键、值对添加到当前字典对象
aDict.update({'a': 'a', 'b': 'b'})
print(aDict)
'''
字典删除
使用del删除整个字典,或者字典中的指定元素
使用pop()和popitem()方法弹出并删除指定元素
使用clear()方法清空字典中所有元素
'''
x={}
x['name']="tom"
x['age']=20
print(x)
x.clear()
print(x)
x={}
x['name']="tom"
x['age']=20
print(x)
print(x.popitem())
print(x)
# 判断key是否在字典中
d = {'name':'tom', 'age':10, 'Tel':110}
print(d.keys())
print ('name' in d.keys())
print ('age' in d)
print("---------------------------------")
# 遍历dict集合思路
# 遍历key值 获得value值
for key in d:
print(key+" "+str(d[key]))
print("---------------------------------")
for key in d.keys():
print(key + " " + str(d[key]))
print("---------------------------------")
# 获得value值
for value in d.values():
print(value)
print("---------------------------------")
# 获得item 分别获得key值与value值
print(d.items())
for key,value in d.items():
print(key+" "+str(value))
print("--------------------------------- 用[] 来降维")
for item in d.items():
print(item[0]+" "+str(item[1]))
print("---------------------------------")
for (key,value) in d.items():
print(key+':'+str(value))
# 向dict添加元素极其顺序 目前加入顺序与数据结构顺序一致
x = dict()
y = {}
print(x)
print(y)
x['a'] = 3
x['c'] = 8
x['b'] = 5
print(x)
import collections
x =collections.OrderedDict()
x['a'] = 3
x['c'] = 8
x['b'] = 5
print(x)
for item in x:
print(item+" "+str(x[item]))
'''
字典推倒式
{ key_expr: value_expr for value in collection if condition }
相当于
for value in collection:
if condition:
d[value[1]]=value[0]
'''
strings = ['import','is','with','if','file','exception','liuhu']
d = {key: val for val,key in enumerate(strings)}
print(d)
d={}
for val, key in enumerate(strings):
d[key]=val
print(d)
d={}
for item in enumerate(strings):
print(item)
d[item[1]]=item[0]
print(d)
# 输出key字符 value为其长度
s = {strings[i]: len(strings[i]) for i in range(len(strings))}
print(s)
k = {k:len(k)for k in strings}
print(k)
# 练习:同一个字母但不同大小写的值合并起来了。
mc = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
mca = {k.lower(): mc.get(k.lower(), 0) + mc.get(k.upper(), 0) for k in mc.keys()}
print(mca)
mcb={}
for k in mc.keys():
mcb[k.lower()]= mc.get(k.lower(),0)+mc.get(k.upper(),0) # mc.get(k.lower(),0) 后面的0 是如果为none就是0
print(mcb)
# 集合set相当于java中的collection 下的无序集合 每次输出都可能不同!
# 自动去除重复 无序
a = {3, 5}
a.add(7)
a.add(2)
a.add(3)
a.add(4)
a.add(6)
print(a)
a=set()
print(a)
# add remove pop del(无当前空间未定义再次调用会报错) clear(清空)
a = {1, 4, 2, 3}
print(a)
print(a.pop())
print(a.pop())
a.remove(3)
print(a)
a.clear();
print(a)
a = {1, 4, 2, 3}
# del a
# print(a)
# update()来使一个集合加入到当前集合中
a.update({9,8,7,6,5})
print(a)
#list---->set
a_set = set([8, 9, 10, 11, 12, 13])
b_set = {0, 1, 2, 3, 7, 8}
# 并集
print(a_set | b_set)
a_set.union(b_set)
print(a_set.union(b_set))
#交集
print(a_set & b_set)
print(a_set.intersection(b_set))
#差集
print(a_set - b_set)
print(a_set.difference(b_set))
#子集
x={1,2,3}
y={1,2,3,4}
print(x.issubset(y)) #子集
print(x < y) #真子集
import random
#随机选择1~500之间的数
print(random.choice(range(500)))
# 快速生成 100个1~500的随机数
listRandom = [random.choice(range(500)) for i in range(100)]
print(listRandom)
# 将里面的单一元素进行提取
noRepeat = []
for i in listRandom:
if i not in noRepeat:
noRepeat.append(i)
print(noRepeat)
newSet1 = set(listRandom)
newSet2 = set(noRepeat)
print(newSet1)
print(newSet2)
# 集合推导
s = {x.strip() for x in (' he ', 'she ', ' I')}
print(s)
# 统计单词出现的频次
word="I'm a boby, I'm a girl. When it is true, it is ture. that are cats, the red is red."
word=word.replace(',','').replace('.','')
word=word.split()
print(word)
print('第1种方法')
setword=set(word)
for i in setword:
count=word.count(i)
print(i,'出现次数:',count)
print('第2种方法')
dict = {}
for key in word:
dict[key] = dict.get(key, 0) + 1
print(dict)
print('第3种方法')
from collections import Counter
result = Counter(dict)
print(result)
print(result.most_common(3))
# 奥运会足球分组
# # 已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。采用List集合和随机数
# #
# # 2008 北京奥运会男足参赛国家:
# #
# # 科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚,日本,美国,中国,新西兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利
# #
# # 提示:分配一个,删除一个
# // map,保存最终分组结果
# // key保存的是第几组,value是该组对应的国家集合
import random
groupNum2Countrys = {}
strCountrys = "科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚,日本,美国,中国,新西兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利";
countryList = strCountrys.split(",")
for i in range(4):
lstGroup = []
# // 分第1组
# // 随机从集合中选出一个国家,放到第1组里;然后将这个选出的国家,从原来集合中干掉(删除)
# // 重复以上步骤4次
for j in range(4):
selectIndex = random.randint(0,len(countryList)-1)
lstGroup.append(countryList[selectIndex])
countryList.remove(countryList[selectIndex])
groupNum2Countrys[i+1] = lstGroup
for key,value in groupNum2Countrys.items():
print('第' + str(key) + '组')
print(value)
7.变量值与内存
'''
== 运算符比较两个对象的值(对象中保存的数据),而 is 比较对象的引用(标识)。 通常,我们关注的是值,而不是标识,因此 Python 代码中 == 出现的频率比 is 高。
java中我们常说 .equals是值 == 是地址
python中 == 是值 is 是地址
'''
charles = {'name': 'Charles L. Dodgson', 'born': 1832}
lewis = charles
alex = {'name': 'Charles L. Dodgson', 'born': 1832, 'balance': 950}
print(lewis is charles) #True 地址相同
print(alex == charles) #False 值不同
print(alex is not charles ) #alex 与charles地址不同
'''
传参数 可以用贴标签来理解
'''
def f1(a,b):
a+=b
return a
x=1
y=2
print(f1(x,y))
print(x)
def f1(a,b):
a+=b
return a
x=(1,2)
y=(3,4)
print(f1(x,y))
print(x)
x=[1,2]
y=[3,4]
print(f1(x,y)) #原地址不变
print(x)
'''
不可变类型,内存中的数据不允许被修改:
数字类型 int, bool, float, complex, long(2.x)
字符串 str
元组 tuple
可变类型,内存中的数据可以被修改:
列表 list
字典 dict
自定义类型(class定义的类型,后面讲到)
此处可以类比java中在堆内存中 被修改 地址不变,而栈内存中 数据不可修改 当发生变化地址改变
'''
8.函数
#定义函数
def chengji(a,b):
return a*b
print(chengji(2,3))
# 函数的好处 重用
#替换第三个元素
msg = 'abcdefg'
msg = msg[:2] + 'z' + msg[3:]
print(msg)
msg = '1234567'
msg = msg[:2] + '9' + msg[3:]
print(msg)
def insertn(msg,k):
return str(msg[:2])+str(k)+str(msg[3:])
print(insertn("123456",9))
#函数调用 特殊用法
'''
1.调用顺序可调 使用参数赋值
2.使用默认参数可不赋值
3.不定长参数
3.1未命名 *abc 变量为tuple元组
3.2命名 **abc dict 字典
'''
def f(name,age):
print(name+":"+str(age))
f("tom",19)
f(age=18,name="jerry")
#默认参数
def print_info(name,age,sex="male"):
print(name+":"+str(age)+":"+sex)
print_info("tomcat2",2)
print_info("tomcat1",2,"female")
def a(*tuplea):
print(tuplea)
a(1,23,4,5,67)
def a(**abc):
print(abc)
a(name="tom",age=12)
def print_info(name,*args,**kwargs):#def print_info(name,**kwargs,*args):报错 * 在前 **在后
print('Name:%s'%name)
print('args:',args)
print('kwargs:',kwargs)
#传值时注意 后面的nickname内部不要与name重名
print_info("tom",1,2,3,4,nickname="tom",key="asdf")
#将set 与dict 解析 分别使用* 与**
print_info("jerry",*{1,23,4,5},**{"nickname":"aaa"})
# 函数的返回值
'''
return多个对象,解释器会把这多个对象组装成一个元组作为一个整体结果输出
这里与java不同java不能返回多个对象
'''
def f():
return 1,2
print(f())
'''
高阶函数
接受一个或多个函数作为输入 输出一个函数
java中无此用法 类似javascript语法
'''
def a(k):
return k+1
def b(b,a):
return a(b)
print(b(10,a))
def add(x, y, f):
return f(x) + f(y)
res = add(3, -6, abs)
print(res)
"""
变量获得方法
"""
def method():
x = 2
def double(n):
return n * x
return double
fun = method()
print(type(fun)) #class function
num = fun(20)
print(num)
'''
变量作用域
'''
x = str(100) # int built-in
print('hello' + x)
g_count = 0 # global
def outer():
o_count = 1 # enclosing
def inner():
i_count = 2 # local
print(o_count)
# print(i_count) 找不到
inner()
outer()
"""
python中作用域与java不同
在Python中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,
其它的代码块(如if、try、for等)是不会引入新的作用域的
"""
if(1==1):
x=10
print(x)
def test():
x = 2
print(x) # NameError: name 'x2' is not defined
"""
# 错误的原因在于print(x)时,解释器会在局部作用域找,会找到x=5(函数已经加载到内存),但x使用在声明前了,所以报错:
# local variable 'x' referenced before assignment.如何证明找到了x=5呢?简单:注释掉x=5,x=6
# 报错为:name 'x' is not defined
global 可以将变量声明在全局变量 位置
"""
x=6
def f2():
# print(x)
# global x
# nonlocal x
x=5
# x=x+1
f2()
print(x)
def f4():
y = 6
def f3():
nonlocal y
y=5
# x=x+1
f3()
print(y)
f4()
# print(y)
'''
递归函数
'''
def factorial_new(n):
if n==1:
print("1=",end="")
return 1
else:
print(f"{n}*",end="")
return n*factorial_new(n-1)
print(factorial_new(6))
def fibo_new(n):#n可以为零,数列有[0]
if n <= 1:
return n
return(fibo_new(n-1) + fibo_new(n-2))
print(fibo_new(10))
# 匿名函数
# def f(x,y):
# temp=x
# x=y
# y=temp
# return (x,y)
f=lambda x,y:x if x>y else y
print(f(3,2))
# 求列表[1,2,3,4,5,6,7,8,9],返回一个n*n 的列表
li=[1,2,3,4,5,6,7,8,9]
listn=[]
for num,n in enumerate(li):
listn.append(n**2)
print(listn)
li=[1,2,3,4,5,6,7,8,9]
# listn=[]
for num,n in enumerate(li):
li[num]=n*n
# listn[num]=n*n #IndexError: list assignment index out of range
print(str(num)+":"+str(n))
print(li)
li=[1,2,3,4,5,6,7,8,9]
# map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回
print(list(map(lambda x:x**2 ,li)))
# reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
# reduce(func,[1,2,3]) 等同于 func(func(1,2),3)
# 1*2......9 累乘
from functools import reduce
li=[1,2,3,4,5,6,7,8,9]
print(reduce(lambda x,y:x*y,li))
# filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
# 在一个list中,删掉偶数,只保留奇数
li = [1, 2, 4, 5, 6, 9, 10, 15]
print(list(filter(lambda x:True if x%2==1 else False ,li)))
# 回数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()筛选出回数
#方法一
print(list(filter(lambda x:True if list(str(x))==list(reversed(str(x))) else False ,list(range(1000)))))
print(list(filter(lambda x:True if str(x)==str(x)[::-1] else False ,list(range(1000)))))
#方法二
str1="abcd"
print(str1[::-1])
# sorted函数 接收一个key函数来实现对可迭代对象进行自定义的排序
# 可迭代对象:主要与列表,字符串,元祖,集合和字典
# key:接受一个函数,根据此函数返回的结果,进行排序
# reverse:排序方向,默认为从小到大,reverse=True为逆向
# 对列表按照绝对值进行排序
li= [-21, -12, 5, 9, 36]
print(sorted(li,key=lambda x:abs(x),reverse=False))
# 把下面单词以首字母排序
li = ['bad', 'about', 'Zoo', 'Credit']
#方法1 指定位置
print(sorted(li, key = lambda x : x[0]))
#方法2 切片
print(sorted(li, key = lambda x : x[:1]))
#按字母顺序
print(sorted(li, key = lambda x : str(x)[0:1].lower()))
# 假设我们用一组tuple表示学生名字和成绩:
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
# 请用sorted()对上述列表分别按名字排序
print(sorted(L,key=lambda x:x[0]))
# 再按成绩从高到低排序
print(sorted(L,key=lambda x:x[1],reverse=True))
"""
函数式编程
函数式编程中的函数这个术语不是指计算机中的函数,而是指数学中的函数,即自变量的映射。
也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。比如y=x*x函数计算x的平方根,
只要x的平方,不论什么时候调用,调用几次,值都是不变的
命令式编程
命令式编程是面向计算机硬件的抽象,有变量(对应着存储单元),赋值语句(获取,存储指令),
表达式(内存引用和算术运算)和控制语句(跳转指令),一句话,命令式程序就是一个冯诺依曼机的指令序列。
"""
# 把number =[2, -5, 9, -7, 2, 5, 4, -1, 0, -3, 8]中的正数的平均值
# 命令式编程
number =[2, -5, 9, -7, 2, 5, 4, -1, 0, -3, 8]
count = 0
sum = 0
for i in range(len(number)):
if number[i]>0:
count += 1
sum+=number[i]
print(sum,count)
if count>0:
average = sum/count
print(average)
# 函数式编程
from functools import reduce
number =[2, -5, 9, -7, 2, 5, 4, -1, 0, -3, 8]
positive = filter(lambda x: x>0, number)
listp=list(positive)
# print(reduce(lambda x,y:x+y,list(positive)))
average = reduce(lambda x,y:x+y,listp)/len(listp)
print(average)
# 导入整个模块
# import pizza
# pizza.make_pizza(16, 'pepperoni')
# pizza.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
# 导入特定的函数
# 若使用这种语法,调用函数时就无需使用句点。由于我们在import语句中显式地导入了函数make_pizza(),因此调用它时只需指定其名称。
# from pizza import make_pizza
#
# make_pizza(16, 'pepperoni')
# make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
# 使用as给函数指定别名
# from pizza import make_pizza as mp
# mp(16, 'pepperoni')
# mp(12, 'mushrooms', 'green peppers', 'extra cheese')
# 使用as给模块指定别名
# import pizza as p
# p.make_pizza(16, 'pepperoni')
# p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
# 导入模块中的所有函数 *
from pizza import *
help(make_pizza)
# make_pizza(16, 'pepperoni')
# make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
pizza.py
def make_pizza(size, *toppings):
"""概述要制作的比萨"""
print("\nMaking a " + str(size) +
"-inch pizza with the following toppings:")
for topping in toppings:
print("- " + topping)