#【关于格式化字符串】

#Python对字符串进行格式化的两种方式:
#1、使用%进行格式化;
print('%02d-%02d' % (3, 1))
print('%.2f' % 3.1415926)
print('grown rate : %d %%' % 7)

#2、format()方法进行格式化
print('你好, {0}, 成绩总分为 {1:.1f}, 总成绩提升 {2:.2f}%'.format('小明', 295.5, 12.35))
print('苹果, 英文:{0:s}, 单价 {1:.1f}, 总价 {2:.2f}'.format('Apple', 6.5, 12.35))

 

#【关于List】

#Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
fruits = ['pear', 'orange', 'plum', 'mango']
print(fruits)

#len()函数可以获得list元素的个数:
print('the fruits\'s len = ', len(fruits))

#通过索引访问list元素
#从前面开始取,如获取第一个元素
print('fruits[0] : ', fruits[0])

#当索引超过list的长度时,Python会报IndexError的错误。list最后一个元素的索引是len(fruits) - 1
#print(fruits[4], '\n')

#从后面开始取,如取最后一个元素
print('fruits[-1]', fruits[-1])
#取倒数第二个元素
print('fruits[-2]', fruits[-2])

#list是一个可变的有序表,所以,可以往list中追加元素到末尾:
fruits.append('apple')
fruits.append('banana')
fruits.append('grape')

#遍历list里面的元素
for name in fruits:
    print('the fruits:', name)

for x in range(len(fruits)-1):
	print('fruits[x]:', fruits[x])

#把元素插入到指定的位置,比如索引号为1的位置:
fruits.insert(1, 'pineapple')
print('after insert: ', fruits)

#要删除list末尾的元素,用pop()方法:
fruits.pop()
print('after pop(): ', fruits)

#要删除指定位置的元素,用pop(i)方法,其中i是索引位置:
fruits.pop(1)
print('after pop(1): ', fruits)

#把某个元素替换成别的元素,可以直接赋值给对应的索引位置:
fruits[1] = 'Hami melon'
print('set fruits[1] = \'Hami melon\': ', fruits)

#list里面的元素的数据类型也可以不同,比如:
lst = ['apple', 123, True]
print('lst : ', lst)

#list元素也可以是另一个list,比如:
s = ['python', 'java', ['asp', 'php'], 'scheme']
print('s : ', s)
print('len(s) : ', len(s))

#要拿到'php'可以写s[2][1]
print('s[2][1] : ', s[2][1])

L = [
    ['Apple', 'Google', 'Microsoft'],
    ['Java', 'Python', 'Ruby', 'PHP'],
    ['Adam', 'Bart', 'Lisa']
]
print('打印L : ', L)
# 打印Apple:
print('打印Apple : ', L[0][0])
# 打印Python:
print('打印Python : ', L[1][1])
# 打印Lisa:
print('打印Lisa : ', L[2][2])

#【关于tuple】

#tuple和list非常类似,但是tuple一旦初始化就不能修改,它也没有append(),insert()这样的方法。
#tuple的陷阱:当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来,比如:
skills = ('c++', 'java', 'python', 'html')
print('skills : ', skills)
#现在,skills这个tuple不能变了,其他获取元素的方法和list是一样的,
#可以正常地使用skills[0],skills[-1],但不能赋值成另外的元素。


#只有1个元素的tuple定义时必须加一个逗号,来消除歧义:
t = (1,)
#Python在显示只有1个元素的tuple时,也会加一个逗号,,以免你误解成数学计算意义上的括号。
print('t : ', t)

#tuple所谓的“不变”是说:tuple的每个元素,指向永远不变。
tuple1 = (1, 2, ['A', 'B'])
tuple1[2][0] = 'X'
tuple1[2][1] = 'Y'
print('tuple1 : ', tuple1)

#【关于条件判断】

#input()返回的数据类型是str,str不能直接和整数比较,必须先把str转换成整数。
szAge = input('please input age: ')
_age = int(szAge)
if _age >= 18: #注意有个冒号
    print('adult')
elif _age >= 6:
    print('teenager')
else:
    print('kid')

#【关于循环】

#比如我们想计算1-10的整数之和,可以用一个sum变量做累加:
sum = 0
for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
    sum = sum + x
print('the 0~10 sum : ', sum)

#如果要计算1-100的整数之和,从1写到100有点困难,幸好Python提供一个range()函数,可以生成一个整数序列,
#再通过list()函数可以转换为list。比如range(5)生成的序列是从0开始小于5的整数:
print('list(range(5)) : ', list(range(5)))

#计算0~100之和
sum = 0
for x in range(101):
    sum = sum + x
print('0~100之和: ', sum)

#while循环
#计算100以内所有奇数之和
sum = 0
n = 1
while n < 100:
    sum = sum + n
    n += 2
print('0~100的奇数之和: ', sum)

#如果要提前结束循环,可以用break语句:
n = 1
while n < 100:
	if n > 10:
		print('n>10, break')
		break
	n = n+1
print('END')

#只打印奇数,可以用continue语句跳过某些循环:
n = 0
while n < 10:
    n = n + 1
    if n % 2 == 0: # 如果n是偶数,执行continue语句
        continue # continue语句会直接继续下一轮循环,后续的print()语句不会执行
    print(n)

#【关于dict】

#dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
scores = {'c++':95, 'java':85, 'python':75}
print('the scores : ', scores)
print('scores[\'c++\'] : ', scores['c++'])

#把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:
scores['asp.net'] = 97
scores['php'] = 95
print('the scores : ', scores)

#由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉:
scores['java'] = 99
print('set java=99, the scores : ', scores)

#如果访问的key不存在,dict就会报错(KeyError: 'html'):
#print('scores[\'html\'] : ', scores['html'])

#要避免key不存在的错误,有两种办法:
#一是通过in判断key是否存在:
print('\'html\' in scores : ', 'html' in scores)

#二是通过dict提供的get()方法,如果key不存在,可以返回None,
print('scores.get(\'html\')', scores.get('html'))
#或者自己指定的value:
print('scores.get(\'html\', -1)', scores.get('html', -1))

#要删除一个key,用pop(key)方法,对应的value也会从dict中删除:
scores.pop('java')
print('after pop(\'java\')', scores)

#value可以是列表
lst = ['apple', 123, True]
_dict = {'one':lst, 'two':85, 'three':75}
print('_dict:', _dict)

'''
和list比较,dict有以下几个特点:
1、查找和插入的速度极快,不会随着key的增加而变慢;
2、需要占用大量的内存,内存浪费多。
而list相反:
1、查找和插入的时间随着元素的增加而增加;
2、占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
'''

#【关于set】

#set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中没有重复的key。
t = (1,7,4)
print('t', t)

_set = set(t)
print('set(t)', _set)

#重复元素在set中自动被过滤:
s = set([1, 1, 2, 2, 3, 3])
print('s', s)

#通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:
s.add(4)
print('after s.add(4)', s)

#通过remove(key)方法可以删除元素:
s.remove(4)
print('after s.remove(4)', s)

#set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
_set1 = set([1,2,3,4])
_set2 = set([2,3,4,5])
print('_set1 & _set2', _set1 & _set2)
print('_set1 | _set2', _set1 | _set2)