2021-04-25

Python训练营 Task2  Python基础入门:Python基础练习:数据结构大汇总 学习笔记

学习地址:https://tianchi.aliyun.com/notebook-ai/home#notebookLabId=195116&notebookType=ALL&isHelp=false&operaType=5

 

一、学习知识点概要

对python的基本了解

列表、元组、字符串、字典、集合、序列

  • 列表<class 'list'>
  • 元组<class 'tuple'>
  • 字典<class 'dict'>
  • 集合<class 'set'>
  • 字符串<class 'str'>

 

二、学习内容

1、Python 是一种通用编程语言,其在科学计算和机器学习领域具有广泛的应用。

2、列表

    2.1 列表的定义:列表是有序集合,没有固定大小,能够保存任意数量任意类型的 Python 对象,语法为 [元素1, 元素2, ..., 元素n]

  • 关键点是「中括号 []」和「逗号 ,」
  • 中括号 把所有元素绑在一起
  • 逗号 将每个元素一一分开

    2.2 列表的创建:

  • 普通列表的创建

 

  • 利用range()创建列表  

 

  • 利用推导式创建列表(由于list的元素可以是任何对象,因此列表中所保存的是对象的指针。)

 

  •  混合列表的创建

 

  • 创建空列表   (列表内容可更改 (mutable),因此附加 (appendextend)、插入 (insert)、删除 (removepop) 这些操作都可以用在它身上。)

        empty = [  ]
        print(empty, type(empty))  # [  ] <class 'list'>   

 

      2.3 列表添加元素  list.append(obj)  、 list.extend(seq) 、list.insert(index, obj)

           注意: list.append(obj) 只接受一个参数,参数可以是任何数据类型,被追加的元素在 list 中保持着原结构类型

                       list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)

                       list.insert(index, obj) :

                                                       1  x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
                                                       2  x.insert(2, 'Sunday')
                                                       3  print(x)
                                                       4  # ['Monday', 'Tuesday', 'Sunday', 'Wednesday', 'Thursday', 'Friday']
 

           区别:append 为追加; expend 为扩展

      2.4 列表删除元素 :list.remove(obj) 、list.pop([index=-1]) 、del var1[, var2 ……]

            list.remove(obj) 移除列表中某个值的第一个匹配项

            list.pop([index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值

            del var1[, var2 ……] 删除单个或多个对象;知道要删除的元素在列表中的位置,可使用del语句。

          区别:remove 和 pop 都可以删除元素,前者是指定具体要删除的元素,后者是指定一个索引

                     如果你要从列表中删除一个元素,且不再以任何方式使用它,就使用del语句;如果你要在删除元素后还能继续使用它,就使用方法pop()

     2.5 获取列表元素 (切片的通用写法是 start : stop : step)

  • 通过元素的索引值,从列表获取单个元素,注意,列表索引值是从0开始的。
  • 通过将索引指定为-1,可让Python返回最后一个列表元素,索引 -2 返回倒数第二个列表元素,以此类推。

情况一   "start :"  以 step 为 1 (默认) 从编号 start 往列表尾部切片。

1 x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
2 print(x[3:])  # ['Thursday', 'Friday']
3 print(x[-3:])  # ['Wednesday', 'Thursday', 'Friday']

 

情况二   ": stop"   以 step 为 1 (默认) 从列表头部往编号 stop 切片。

1 week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
2 print(week[:3])     # ['Monday', 'Tuesday', 'Wednesday']
3 print(week[:-3])   # ['Monday', 'Tuesday']

 

情况三 "start : stop"  以 step 为 1 (默认) 从编号 start 往编号 stop 切片。

1 week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
2 print(week[1:3])     # ['Tuesday', 'Wednesday']
3 print(week[-3:-1])  # ['Wednesday', 'Thursday']

 

情况四  "start : stop : step"  以具体的 step 从编号 start 往编号 stop 切片。注意最后把 step 设为 -1,相当于将列表反向排列。

1 week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
2 print(week[1:4:2])  # ['Tuesday', 'Thursday']   ;2为步长(step)
3 print(week[:4:2])    # ['Monday', 'Wednesday']
4 print(week[1::2])    # ['Tuesday', 'Thursday']
5 print(week[::-1])     # ['Friday', 'Thursday', 'Wednesday', 'Tuesday', 'Monday']

 

3.元组

  3.1创建和访问一个元组

       元组与列表的区别

  • 元组(tuple)被创建后就不能对其进行修改,类似字符串。
  • 元组使用小括号,列表使用方括号。
  • 元组与列表类似,也用整数来对它进行索引 (indexing) 和切片 (slicing)。
  • 创建元组可以用小括号 (),也可以什么都不用。(建议使用小括号)
  • 元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用。

 

  3.2 更新和删除一个元组(元组有不可更改的性质,因此不能直接给元组的元素赋值,但是只要元组中的元素可更改,我们可以直接更改其元素,注意这跟赋值其元素不同。

1 t1 = (1, 2, 3, [4, 5, 6])
2 print(t1)  # (1, 2, 3, [4, 5, 6])

3 t1[3][0] = 9
4 print(t1)  # (1, 2, 3, [9, 5, 6])

 

  3.3 元组有两种拼接方式:

' + ' (加号) :首尾拼接

' * ' (乘号):复制拼接

  

  3.4内置方法 (count 和 index 两种方法。

1 t = (1, 10.31, 'python')
2 print(t.count('python'))    # 1
3 print(t.index(10.31))       # 1

  • count('python') 是记录在元组 t 中该元素出现几次,显然是 1 次
  • index(10.31) 是找到该元素在元组 t 的索引,显然是 1

 

4.字符串:引号之间的字符集合(支持使用 单引号 和 双引号)

   4.1 转义字符

 

   \\   反斜杠符号

   \'   单引号

   \"   双引号

   \n   换行

   \t   横向制表符(TAB)

   \r   回车

   

   4.3 字符串的切片与拼接

  • 从 0 开始 
  • 切片通常写成 start:end 这种形式,包括「start 索引」对应的元素,不包括「end索引」对应的元素。
  • 索引值可正可负,正索引从 0 开始,从左往右;负索引从 -1 开始,从右往左。使用负数索引时,会从最后一个元素开始计数。最后一个元素的位置编号是 -1。

例如:

1 str1 = 'I Love LsgoGroup'
2 print(str1[:6])                                                 # I Love
3 print(str1[5])                                                  # e
4 print(str1[:6] + " 插入的字符串 " + str1[6:])    # I Love 插入的字符串  LsgoGroup

 

1 s = 'Python'
2 print(s)             # Python
3 print(s[2:4])      # th
4 print(s[-5:-2])   # yth
5 print(s[2])        # t
6 print(s[-1])      # n

 

   4.4 字符串格式化

 

%c格式化字符及其ASCII码
%s格式化字符串,用str()方法处理对象
%r格式化字符串,用rper()方法处理对象
%d格式化整数
%o格式化无符号八进制数
%x格式化无符号十六进制数
%X格式化无符号十六进制数(大写)
%f格式化浮点数字,可指定小数点后的精度
%e用科学计数法格式化浮点数
%E作用同%e,用科学计数法格式化浮点数
%g根据值的大小决定使用%f或%e
%G作用同%g,根据值的大小决定使用%f或%E

 

5、字典

   5.1 判断一个数据类型 X 是不是可变类型的两种方法:

  • 麻烦方法:用 id(X) 函数,对 X 进行某种操作,比较操作前后的 id,如果不一样,则 X 不可变,如果一样,则 X 可变。
  • 便捷方法:用 hash(X),只要不报错,证明 X 可被哈希,即不可变,反过来不可被哈希,即可变。

 

  5.2字典定义:字典是无序的键:值(key:value)对集合,键必须是互不相同的(在同一个字典之内)。

  • dict 内部存放的顺序和 key 放入的顺序是没有关系的。
  • dict 查找和插入的速度极快,不会随着 key 的增加而增加,但是需要占用大量的内存。

   字典 定义语法为 {元素1, 元素2, ..., 元素n}

  • 其中每一个元素是一个「键值对」-- 键:值 (key:value)
  • 关键点是「大括号 {}」,「逗号 ,」和「冒号 :」
  • 大括号 -- 把所有元素绑在一起
  • 逗号 -- 将每个键值对分开
  • 冒号 -- 将键和值分开

 

5.3 创建和访问字典

dict() 创建一个空的字典

通过key直接把数据放入字典中,但一个key只能对应一个value,多次对一个key放入 value,后面的值会把前面的值冲掉。

例如:

1 dic = dict()
2 dic['a'] = 1
3 dic['b'] = 2
4 dic['c'] = 3

5 print(dic)
6  # {'a': 1, 'b': 2, 'c': 3}

 

1 dic['a'] = 11
2 print(dic)
3  # {'a': 11, 'b': 2, 'c': 3}

 

1 dic['d'] = 4
2 print(dic)
3  # {'a': 11, 'b': 2, 'c': 3, 'd': 4}

 

5.4 字典的内置方法 

  • dict.fromkeys(seq[, value]) 用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。
  • dict.keys() 返回一个可迭代对象,可以使用 list() 来转换为列表,列表为字典中的所有键。
  • dict.items() 以列表返回可遍历的 (键, 值) 元组数组。
  • dict.get(key, default=None)  返回指定键的值,如果值不在字典中返回默认值。
  • dict.setdefault(key, default=None) get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值
  • key in dict in  操作符用于判断键是否存在于字典中,如果键在字典 dict 里返回true,否则返回false。而not in操作符刚好相反,如果键在字典 dict 里返回false,否则返回true
  • dict.pop(key[,default]) 删除字典给定键 key 所对应的值,返回值为被删除的值。key 值必须给出。若key不存在,则返回 default 值。
  • del dict[key]  删除字典给定键 key 所对应的值。
  • dict.clear() 用于删除字典内所有元素。
  • dict.popitem() 随机返回并删除字典中的一对键和值,如果字典已经为空,却调用了此方法,就报出KeyError异常

 

6.集合

   6.1 集合的创建

  • 先创建对象再加入元素。
  • 在创建空集合的时候只能使用s = set(),因为s = {}创建的是空字典

 

   6.2 访问集合中的值

  • ​可以使用len()內建函数得到集合的大小。

1 s = set(['Google', 'Baidu', 'Taobao'])
2 print(len(s))

3  # 3

 

  • 可以使用for把集合中的数据一个个读取出来。

1 s = set(['Google', 'Baidu', 'Taobao'])
2 for item in s:
3     print(item)
    
4 # Baidu
5 # Google
6 # Taobao

 

 

6.3 集合的内置方法

  • set.add(elmnt)用于给集合添加元素,如果添加的元素在集合中已存在,则不执行任何操作。
  • set.update(set)用于修改当前集合,可以添加新的元素或集合到当前集合中,如果添加的元素在集合中已存在,则该元素只会出现一次,重复的会忽略
  • set.remove(item) 用于移除集合中的指定元素。如果元素不存在,则会发生错误。
  • set.discard(value) 用于移除指定的集合元素。remove() 方法在移除一个不存在的元素时会发生错误,而 discard() 方法不会。
  • set.pop() 用于随机移除一个元素。
  • 由于 set 是无序和无重复元素的集合,所以两个或多个 set 可以做数学意义上的集合操作。

 

三、学习问题与解答

冒号切片的内容有点难理解,它们的取值规则有点奇怪。

解答:我在网上查找是发现一个关于切片的口诀“左右空,取到头;左要取,右不取” ;也就是 “左取右不取”,也可以用数学上的区间 [a,b)来理解

 

四、学习思考与总结

  在Task2中我学习到了Python语言的构成部分,初步了解了python的基础构成;在这次的学习中,也出现了上一次任务的内容,例如程序的报错,深化了我对上一次学习的理解,这也启示了我,每个任务都是有关联的,要在认真对待每次学习,这样才能更好地掌握这门编程语言。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用python中的pymsql完成如下:表结构与数据创建 1. 建立 `users` 表和 `orders` 表。 `users` 表有用户ID、用户名、年龄字段,(id,name,age) `orders` 表有订单ID、订单日期、订单金额,用户id字段。(id,order_date,amount,user_id) 2 两表的id作为主键,`orders` 表用户id为users的外键 3 插入数据 `users` (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28); `orders` (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4); 查询语句 1. 查询订单总金额 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 3. 查询订单总数最多的用户的姓名和订单总数。 4. 查询所有不重复的年龄。 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 8. 查询订单总金额最大的用户的姓名和订单总金额。 9. 查询订单总金额最小的用户的姓名和订单总金额。 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。
最新发布
06-03
这里是使用 Python 的 PyMySQL 完成上述任务的代码: ```python import pymysql # 连接数据库 conn = pymysql.connect(host='localhost', port=3306, user='root', password='123456', database='test') # 创建游标 cur = conn.cursor() # 创建 users 表 cur.execute(''' CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(20), age INT ) ''') # 创建 orders 表 cur.execute(''' CREATE TABLE orders ( id INT PRIMARY KEY, order_date DATE, amount INT, user_id INT, FOREIGN KEY (user_id) REFERENCES users(id) ) ''') # 插入数据 users_data = [ (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28) ] orders_data = [ (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4) ] for user in users_data: cur.execute('INSERT INTO users VALUES (%s, %s, %s)', user) for order in orders_data: cur.execute('INSERT INTO orders VALUES (%s, %s, %s, %s)', order) # 提交事务 conn.commit() # 查询语句 # 1. 查询订单总金额 cur.execute('SELECT SUM(amount) FROM orders') print(cur.fetchone()[0]) # 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 cur.execute('SELECT ROUND(AVG(age), 2) FROM users') print(cur.fetchone()[0]) # 3. 查询订单总数最多的用户的姓名和订单总数。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_orders DESC LIMIT 1 ''') print(cur.fetchone()) # 4. 查询所有不重复的年龄。 cur.execute('SELECT DISTINCT age FROM users') print([row[0] for row in cur.fetchall()]) # 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 cur.execute('SELECT SUM(amount) FROM orders WHERE order_date BETWEEN "2021-09-01" AND "2021-09-04"') print(cur.fetchone()[0]) # 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders FROM users JOIN orders ON users.id = orders.user_id WHERE age <= 25 GROUP BY users.id ORDER BY total_orders DESC ''') print(cur.fetchall()) # 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC LIMIT 3 ''') print(cur.fetchall()) # 8. 查询订单总金额最大的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC LIMIT 1 ''') print(cur.fetchone()) # 9. 查询订单总金额最小的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount ASC LIMIT 1 ''') print(cur.fetchone()) # 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 cur.execute('SELECT * FROM users WHERE name LIKE "%李%" ORDER BY name ASC') print(cur.fetchall()) # 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 cur.execute('SELECT * FROM users WHERE age > 20 ORDER BY age DESC LIMIT 5') print(cur.fetchall()) # 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC ''') print(cur.fetchall()) # 关闭游标和连接 cur.close() conn.close() ``` 注意:在运行代码之前,需要先安装 PyMySQL 模块,可以使用以下命令进行安装: ``` pip install pymysql ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值