【语言学论文阅读·第3期】多模态隐喻（重塑）框架：后疫情时代新媒体上中国湖北省宣传形象的批判性分析
[scode type="red"]请注意，本文仅供个人学习归纳使用，请勿传播、商用。本文文章来源于互联网，使用翻译软件进行未精校的粗略翻译，结果仅供了解参考。本文不能作为了解原作者观点的可靠依据，欲了解作者观点，请参照原文理解。[/scode][scode type="share"]原文Doi: 10.1080/10350330.2022.2094233 [/scode]多模态隐喻（重塑）框架：后疫情时代新媒体上中国湖北省宣传形象的批判性分析Multimodal metaphor (re)framing: A critical analysis of the promotional image of China’s Hubei Province in the postpandemic era on new mediaYufeng Liu and Dechao Li本研究将多模态隐喻作为（重塑）框架工具，分析了一则由中国政府制作、并在 YouTube、抖音（中国版 Tik Tok）和微信视频号等新媒体平台上传播的 10 分钟湖北省宣传视频。该视频向世界介绍了湖北省在疫情前、疫情中和疫情后的情况，旨在消除西方媒体描绘的“武汉病毒”和“中国病毒”的偏见形象。本研究借鉴了 MIPVU（Metaphor Identification Procedure Vrije Universiteit，隐喻识别程序自由大学版）、隐喻的多模态性以及 CDA（Critical Discourse Analysis，批评性话语分析），分析了中国政府如何尝试通过诸如战争（WAR）、桥梁（BRIDGE）、手（HAND）和背影（BACK）等隐喻，将湖北重塑为一个充满勇气、繁荣和人性的地方。研究还讨论了此类隐喻使用的利弊，并结合了适当的语境和社会文化关联性。该研究提供了基于 CDA 的多模态隐喻分析的实践操作，并通过社会学的框架理论证明了整合翻译、隐喻和符号学研究的可行性。关键词：隐喻；多模态；（重塑）框架；新媒体；冠状病毒；武汉
墨尔本大学 应用语言学硕士(MCAPLING)200学分课程一览
English language 200 point programFollow:Handbook of English Language (200pt)Handbook of Master of Applied Linguistics (MC-APLING)Introduction of Master of Applied LinguisticsNoteThe 200 point Master of Applied Linguistics program in all specialisations is only available to on-campus students.For students completing the two-part thesis capstone in the final 100 points of the program, your study load is combined over these final two semesters (100 points). This means that in your final two semesters, you will complete the thesis parts 1 and 2 (18.75 points each, 37.5 points combined) plus five other 12.5 point subjects – three subjects in one of the semesters, and two in the other. This means that in one semester of the thesis capstone, students will complete a total of 56.25 points in their study plan, and in the other, 43.75 points (total of 100 points). This is not considered overloading, and no permission is required to add three 12.5 point subjects plus the 18.75 point thesis subject to your plan in a single semester. It is recommended that students doing the thesis take 3 subjects in the first half of their thesis capstone, and 2 subjects during the semester in which the thesis must be submitted, to allow time for preparing the thesis for submission. Note that if you have not completed Research in Applied Linguistics prior to the first semester of the thesis capstone, this must be taken concurrently with thesis part 1.Compulsory subjects (25 pts)Students must complete 25 points of compulsory subjects.Concepts in Applied Linguistics (12.5)Concepts in Applied Linguistics is a compulsory subject for all students on the Master in Applied Linguistics, and should be taken in the first semester of enrolment in the program. This introductory subject teaches students core concepts; current issues and debates; and diverse research methods in applied linguistics. It introduces students to the three principal specialisations of the Master program: Teaching English as a Second Language (TESOL); Language Testing; and English Language. It tracks the origins of these fields from their diverse theoretical inceptions, such as psycholinguistics, pedagogy and sociolinguistics, to their applications in various domains, including, for example, language teaching and learning; language assessment; and language policy and planning. It also shows how advancements in applied linguistics have been applied to real-world problems such as how to train language teachers; how to design fair and effective language tests; how to combat language discrimination; and how minority languages can be revived and maintained. The subject is an essential part of foundational study for the Master and prepares students for more specialised subjects on the program; for further independent research and study; and for professions in public service, teaching, translation and speech pathology.Sociolinguistics and Language Learning (12.5)In this subject, students will gain a systematic understanding of the relation between language and society and culture and its implications for language learning and teaching. The main topics covered include: Social, regional and stylistic variation and their consequences for the learning and teaching of English and other second languages; bi-multilingualism and diglossia; language, attitudes and identity; language policy, especially languages-in-education policy; cultural values in communication; and multi-modal communication, both online and non-verbal interactions.Foundation compulsory subject (12.5 pts)The Secret Life of Language (12.5)Have you ever wondered how language actually works? Or how it can be that a 6 year-old child can know more about their native language than the most sophisticated computers? This subject is a practical introduction to the nature of human language which gives a conceptual framework for discussing language and provides the tools required to analyze and describe all of the world's 6000+ languages. Central areas of linguistics will be covered using data from languages from all over the world, including speech sounds, word structure, sentence structure, meaning, language learning, and language change.Capstone subjects (choose 1 or 2)Capstone 1: Minor Thesis (50 pts)This capstone gives students an opportunity to integrate knowledge and research skills within the English Language specialization.Applied Linguistics Thesis Part 1 (18.75)A minor thesis of 12,000 words on an approved research project.Applied Linguistics Thesis Part 2 (18.75)A minor thesis of 12,000 words on an approved research project.Research in Applied Linguistics (12.5)This subject provides an introduction to the range of approaches to research as practiced in applied linguistics in three main areas: (a) research paradigms, or the philosophical assumptions concerning knowledge and ethical considerations; (b) research approaches, or the designs for research that includes quasi-experiments, ethnography, discourse analysis, and action research; (c) data collection and analysis techniques, that include surveys, observation, interviews, introspection, and verbal report protocols. Working with these topics and completing assignments will prepare students to design research projects and to critique research in the field of applied linguistics.Capstone 2 (25 pts)This capstone gives students an opportunity to integrate knowledge and skills from the English Language specialization to real-world projects.Projects in Applied Linguistics (25)This subject provides students with the opportunity to apply their disciplinary knowledge to a team-based practical project related to their chosen specialization (TESOL, Language Testing, English Language). Students will gain experience in co-designing and conducting a project, teamwork, and project evaluation. They will develop professional writing skills relevant to producing project proposals and reports, and professional presentation skills relevant to communicating project goals and outcomes to different stakeholders.Elective subjects (112.5-137.5 pts/9-11 courses required, depending on the Capstone's choice)For students with an ESL background:A maximum of 37.5 credit points of Foundation Elective subjects that must be taken in the first 50 credit points of the programBetween 62.5 and 137.5 credit points of Graduate Elective subjectsA maximum of 12.5 credit points of ESL Elective subjectsFor students without an ESL background (applicable):A maximum of 37.5 credit points of Foundation Elective subjects that must be taken in the first 50 credit points of the programBetween 75 and 137.5 credit points of Graduate Elective subjectsFoundation elective subjectsSecond Language Learning and Teaching (12.5)This subject considers how a second language is acquired, what factors explain why only some learners are successful in learning a second language, and how to best teach a second language. We begin by looking at a range of theories which present different perspectives on the process of second language acquisition. We then consider individual factors that may affect success in second language acquisition. These factors include age, aptitude, motivation and learning strategies. We examine approaches to second language instruction, focusing on the four macro skills of speaking, listening, reading and writing. Students are encouraged to reflect upon their own language learning experiences and explain these experiences by reference to the topics covered in the subject.Syntax (12.5)This subject is an introduction to basic concepts and methods of syntactic analysis and description. Emphasis is on practical analysis and description of a wide range of phenomena from a variety of languages. Students should become familiar with topics such as constituent structure, syntactic categories, grammatical functions (interface with morphology), thematic relations (interface with semantics), word order, multi-clausal constructions, including complement clauses, relative clauses and clause linking, and unbounded dependencies.Language, Society and Culture (12.5)This subject examines how social and cultural factors influence language, and the role language plays in structuring and representing social categories across cultures. It examines how society and language shape each other: how language represents and enables social interaction, and how social interaction influences the form of language. Specific topics to be covered include socially determined variation in language styles and registers, language varieties reflecting social class, gender and ethnic group. It also examines factors affecting language choice such as, bi- and multi-lingualism, and factors of language contact and change.First Language Acquisition (12.5)This subject is an overview of how children learn language - from before birth through the school years. We will study development across the core domains of language, including phonology, grammar, semantics and pragmatics. Throughout the subject, there is a focus on cross-linguistic comparison and grounding in relation to current theoretical models of language acquisition and cognitive and social development.Semantics (12.5)This subject is an introduction to the study of meaning, looking at the main linguistic approaches to the study of meaning, techniques of semantic analysis and argumentation, and problems of accounting for some selected areas of linguistic meaning. Topics include classical approaches to meaning, prototype semantics, cognitive linguistics, formal semantics and linguistic categorisation across languages.Corpus Linguistics (12.5)Corpus Linguistics is the computational analysis of real-life language use, drawing on databases of written, spoken or signed language. Corpus data reveals patterns in language that go beyond the standard assumptions of linguistic theory, and it is corpus data that forms the foundation of language technologies such as Google and AI. Students in this course will engage in hands-on workshops, learning how to use custom corpus software, as well as basic Python coding, to discover patterns in language. They will also be guided into the theoretical underpinnings of corpus linguistics – how it reflects the cognitive processing of language, and how it relates to theories of grammatical structure. This course does not assume any previous technical skills, but students must be ready to learn computational tools for exploring corpus data. Assessment will involve data exploration, presenting and discussing analyses, and written work.Graduate elective subjectsPresenting Academic Discourse (12.5)This subject focuses on the advanced language required for successful graduate study in English. In this subject students will develop critical approaches to researching, reading and writing. They will also develop the ability to plan and present confidently on a research topic and to write a literature review fluently and accurately. Particular attention is paid to grammatical and stylistic aspects of written and spoken academic discourse. Students write and present on a research topic that is relevant to their field of study.Research in Applied Linguistics (12.5)This subject provides an introduction to the range of approaches to research as practised in applied linguistics in three main areas: (a) research paradigms, or the philosophical assumptions concerning knowledge and ethical considerations; (b) research approaches, or the designs for research that includes quasi-experiments, ethnography, discourse analysis, and action research; (c) data collection and analysis techniques, that include surveys, observation, interviews, introspection, and verbal report protocols. Working with these topics and completing assignments will prepare students to design research projects and to critique research in the field of applied linguistics.Quantitative Methods in Language Studies (12.5)This is an introductory subject designed to enable students to acquire the basic tools necessary for critically reading about and carrying out quantitative empirical research in applied linguistics. Students will be given practice in the application of statistics in the analysis of data obtained from research and will be introduced to the use of computers with statistical packages to analyse data. Throughout, there will be a focus on the practicality and usefulness of the skills developed for the tasks of understanding research literature in Applied Linguistics, and of carrying out research in settings relevant to students. No prior knowledge of mathematics or of statistical procedures will be assumed.Language Curriculum Design (12.5)This subject adopts a language for specific purposes (LSP) framework to processes of language education. It begins from the premise that all language teaching involves the teaching of language for some specific purpose, and in some specific context. Working within an LSP framework, we look at a range of theoretical and practical approaches to needs analyses and to the design of programs and curricula. Approaches include corpus linguistics, genre theory, Systemic Functional Linguistics, and more socially critical approaches such as Academic Literacies. The subject will involve students collecting and analysing data (e.g. sample texts and interviews) to research the needs of learners and identify the discourses and practices of target communities in academic and professional contexts. Students will also participate in evaluating and developing LSP pedagogical materials and course curricula.Language Program Evaluation (12.5)In this subject, we examine different ways in which the value and/or success of language programs can be understood and measured, drawing on concepts and approaches to evaluation in applied linguistics as well as in the wider field of program evaluation. We consider the ways in which language policy agendas and stakeholder values and goals at various levels (macro-, meso-, and micro-levels) shape the design and implementation of language programs, and the impact this has on classroom practices, teachers, language learners, and language learning outcomes. We will draw on examples of various kinds of language program, including academic and other specific purpose language programs, heritage language programs, and indigenous language programs, to illustrate key concepts, ethical considerations, and practical steps involved in conducting evaluations of language programs.Language Assessment (12.5)Introduction to the theory and practice of language assessment in a range of second language contexts. Topics covered include testing listening, reading, writing, speaking, test analysis, construction and validation of language tests, classroom language assessment and alternative assessment practices. Students will be encouraged to develop solutions to language assessment problems relevant to their own work settings.Second Language Acquisition (12.5)This subject offers a survey of the principal topics currently addressed in the study of second language acquisition, and of the major research methods and paradigms used in such studies. Students should expect to be able to understand critical observation, description and analysis of second language learners and their language performance, the social and psychological aspects of second language learning situations, and the special characteristics of learner language.English Phonetics and Phonology (12.5)This subject focuses on aspects of the English sound system with particular focus on Australian English. Students gain a detailed understanding of the sound system of different varieties of English. The main topics covered include: phonetic analysis (vowel and consonant systems, phonotactics, stress and intonation) of selected English varieties including L2 varieties of English. Throughout the subject, material is drawn from different varieties of English, including English spoken by second language learners. This subject also provides the chance for training in the accurate perception and production of English speech, transcription, and an introduction to acoustic phonetic analysis.Grammar in Use (12.5)This subject explores the main areas of grammar, at the level of the word, the sentence and the text. Throughout the subject, material is drawn from across a range of contexts of use and varieties of English, including Standard English. Through seminars and practical application students gain a systematic understanding of the major features of English grammar, including morphology, syntax, and stylistics, with additional focus on the role of grammar in language use, and descriptive and methodological approaches to the analysis of grammar.Second Language Writing (12.5)The subject will introduce students to key theories of second language writing and composing processes and approaches to second language writing instruction. It will focus on issues that are pertinent to second language writing teachers such as assessing writing, the efficacy of different types of feedback on writing, and measures that can be used to investigate development in L2 writing.Bilingualism (12.5)This subject examines the phenomenon of bi/multilingualism from both individual and societal perspectives. It enables students to understand the language choices made by speakers in bilingual and multilingual settings, the role of language contact in language change, the relationship between language and cognition and the psychological and societal factors influencing language acquisition, language maintenance, and language loss. It also considers educational and political issues associated with bilingualism, and familiarises students with a range of institutional models whereby citizens can be encouraged to successfully learn and use two or more languages in their daily lives.Transcultural Communication at Work (12.5)One outcome of the globalisation of the Australian job market is the increasing need for transcultural communication skills in both the private and public sectors. Transcultural communication typically entails interaction in which one or more of the communicators use a second or third language. Successful transcultural communication requires not only a shared language but also strong intercultural awareness and skills. These include verbal skills such as how and when to use speech and silence as well as non-verbal skills knowing how and when gaze, gesture and body posture may differ across cultures. This subject will provide students with the tools to achieve successful transcultural encounters in professional settings. The delivery of the subject will include lectures with audio-visual materials, discussion sessions to deepen the students' understanding of theories of transcultural communication and their practical implications, and assignments that require an application of presented theories to the analysis of transcultural communication. Sponsored by the School of Languages and Linguistics and the Faculty of Arts' Asia Institute, this subject will focus on transcultural communication at the intersection of cultural, linguistic, ethnic, and religious boundaries. The subject will be taught by sociolinguistic and transcultural communication experts whose expertise ranges from multicultural and Aboriginal Australia, to Asia, the Middle East, Northern and Southern Europe, and the South Pacific.Discourse and Interaction (12.5)This subject investigates the nature of spoken discourse and major approaches to analysing and understanding it; written discourse will also be touched on for comparative purposes. Students will develop their skills in the collection and transcription of spoken language data and in designing research projects in discourse analysis relevant to applied linguistics. A variety of discourse types and genres will be studied, with a focus on dialogic interaction. Theories and approaches covered will include pragmatics, conversation analysis, and critical discourse analysis.Second Language Pragmatics (12.5)This subject provides an overview of research in second language pragmatics. It covers research methods in second language pragmatics, learners’ developmental pathways, effects of individual learner differences and learning contexts on pragmatics learning, teaching and assessment of second language pragmatics, and pragmatics in the age of globalization.Psycholinguistics (12.5)This subject is a general introduction to psycholinguistics. We will study the ways in which language is represented and processed in real time and discuss the factors that enable us to comprehend and use the language. Topics include word processing, sentence processing, discourse processing, linguistic relativity, and non-literal language processing by monolingual and bilingual speakers. Practical training will be provided to familiarize students with a variety of tasks and techniques associated with this field. Students will learn to use the research techniques to design behavioural psycholinguistic experiments.ESLA elective subjectsProfessional Speaking Communication (12.5)This subject is designed for graduate students who would like to improve their spoken English skills for professional contexts. It is aimed at speakers of English as an additional language.Students who complete this subject will become familiar with Australian English pronunciation, will develop confidence and self-awareness, and will improve the clarity and fluency of their speech for use in professional communication. The content covers various aspects of pronunciation, such as individual sounds, sound combinations, syllables and word stress, rhythm, sentence stress, connected speech processes and intonation. Students will also improve their listening-discrimination skills, develop an understanding of the basic processes involved in speech production and gain practical knowledge about the communicative nature of sentence stress and intonation, especially as they apply to workplace settings.Advanced Self-Editing (12.5)The subject aims to improve students’ ability to edit their written texts in order to produce grammatically accurate and stylistically appropriate texts for professional purposes. The subject begins with a review of the most frequent errors in the writing of students who speak English as a Second Language, including errors in morphology, syntax, cohesion, and punctuation, and then considers the impact that such errors may have on meaning. In the second half of the subject, students engage in linguistic analysis of a range of work-place texts (e.g. short reports, media releases). The aim of this analysis is to identify the most salient grammatical and stylistic features that contribute to the clarity of the texts. Throughout the subject students will engage in identifying areas of concern in their writing (annotation), self and peer editing exercises, keeping logs of their progress, and using available online grammar resources.Professional Literacies (12.5)This subject aims to develop effective written communication skills for use in professional workplace contexts. It is designed for graduate students, who are speakers of English as an additional language. Given the wide range of professional workplaces and modes of writing found within these, this subject aims to help students reflect on the different contexts and interactions that are at stake in professional reading and writing. It will do this by teaching students techniques of text analysis to assist them in identifying the conventions of a variety of genres encountered in the workplace. Students will also develop skills in structuring and writing texts that respond appropriately and flexibly to a range of communicative purposes and audiences. Particular attention will be paid to workplace modes of writing (including promotional and hortatory text types), and to the processes of collaborative professional writing.Intercultural Professional Communication (12.5)This subject enhances students’ ability to communicate effectively and strategically in English-speaking professional settings in Australia and internationally. Students will acquire research-based discourse analytic tools to understand workplace cultures and norms of interaction, and develop practical skills in advanced spoken and email-based workplace interaction. Topics include opening and closing conversations, engaging in small talk, raising sensitive issues with peers and superior, making and responding to requests, complaints, and refusals from a position of strength and weakness, structuring short ad hoc speeches, participating in job interviews, and understanding cultural norms of humour, sarcasm and non-literal language use. There will be an emphasis throughout on intercultural differences and awareness raising of how cultural norms impact interaction.Note: This subject is aimed at speakers of English as an additional language. It is not suitable for native speakers of English.
2024年9月，升入大四的我，正式开启了硕士申请的漫漫旅途。事实证明，这一路走来，其艰辛程度绝非一般人所能及。我的主申方向是香港，也就是港前三里的港大和港中文。当然，这一申请抉择的前提是：第一，我对自己3.72的cGPA有充分自信；第二，家里非常建议我去读香港，而我也受他们影响加上自己考虑，强烈地想要达成这一目标；第三，我也选定了几所保底学校。不过说是保底，其实最差的学校都没有低于QS前50名。我当时选定的学校和专业名单是这样的：学校名称QS排名国家/地区专业名称新加坡国立大学8新加坡MA English Language and Linguistics伦敦大学学院9英国Intercultural communication伦敦大学学院9英国Applied Linguistics MA香港大学17中国香港Master of Arts in the field of Linguistics香港大学17中国香港Master of Arts in the field of English Studies爱丁堡大学27英国MSc Applied Linguistics香港中文大学36中国香港MA English (Literary Studies)香港中文大学36中国香港MA Intercultural Studies香港理工大学47中国香港Master of Science (MS) in Generative AI and the Humanities - Language and Communication可以说，我是铁了心想去香港了。当时机构和我联系时，我们就敲定了这个方案，8个项目有5个都是香港，附加1个新加坡和2个英国（一个UCL和跨文化和爱丁堡的AL），机构还附赠了一个UCL的AL。当时，其实我还有澳洲的选择，但我并没有任何想去澳洲留学的打算或欲望，又觉得澳洲的整体印象就是“水”，墨尔本又非常难申请，还不如不申了。不过最后，我自己还是抱着试一试总比不试好的想法，DIY投了墨尔本的AL和新加坡南洋理工的英语研究。但当时，我知道前方的阻碍很大，一是我的语言成绩不够，当时雅思只有6.5（5.5）的分数，和大部分院校（包括HK）要求的7.0尚有差距；二是我也知道自己想去的香港近几年的申请情势算不上很妙，大量内地985/211的优异学生涌入香港，就意味着申请之路一定压力重重。因此，我也做好了打长期战的准备。但是，我没想到，这所谓的“长期战”变成了一场看不到头的远足。自申请资料递交后，我再也没能收到来自任何地方的哪怕一点风声。2024年11月，我DIY的墨尔本发来了“Being Assessed”，这意味着我因为激烈竞争被放入了墨大的waiting list中，墨大不想直接拒我，我的成绩又不足够出众，再加上澳洲缩招的形势，他们说直到下一年1-4月才会出结果。然后，在2024年底，Poly-U给我发来了拒信，但不是邮箱通知，而是完全没有通知。那天只是随手一翻，我登入系统，便看到了Poly-U冷冰冰的Not successful。说到底，我也不奇怪Poly-U会第一个拒我，因为毕竟我的英专和Generative AI实在有如隔了一道天堑，若没有在本科立下扎实的coding基础，我想哪怕Poly-U肯录取我，我也将在Postgrad面临重重阻碍吧。不过Poly-U这一手发拒信连邮件都不发的操作确实恶心到我了。后来，应该是在2025年1月份，我收到了UCL的拒信，这时距离我开始申请已经过去了5个月，不但没有一封offer，反而拒信先收到了3封。尤其是UCL的两封拒信更是让我内心极度受挫。UCL虽然排名靠前，但说到底其“水校”的性质和较为宽松的入学门槛也都几乎是人尽皆知。我原来是拿UCL做保底的，但万万没想到会直接翻车，成了小丑。这下，我真的慌了。UCL都申不上，我当然害怕2025毕业之后会真的会没学上要去gap。在不安和焦虑中，我的身体开始频繁上火，嘴上和脸上的燎泡和痘痘不断在爆，就像我的压力一样。每天，我都执着地翻着邮箱，渴望能有一所学校“收留”这个可怜的、深陷于25Fall焦虑的“好学生”，但重复的结果只有失望和空空如也的邮箱，就好像我从来没有申请过任何学校。情急之下，我开始自己加申澳门大学和港浸会。这两所QS200名开外的大学，在曾经的我眼中就是不入流的学校，但当时我已然慌了。虽然我依旧安慰自己还有机会，但现实一次次的打脸嘲讽已经将我的命运推向了一个无底深渊，在无尽的坠落中，我眼看着身边人一个个拿到了自己心仪学校的offer，而我却只能任由自己坠落。深渊好像没有尽头，而为了抓住点什么，我只能出此计策。2025年2月6日，那一天是正月初九，我在焦虑中刚刚度过了农历新年。这一天，我约好和几个哥们一起出去玩。在车上，我们东扯西谈，而我在一个谈话间隙中掏出手机惯例式地查看微信。突然，我发现自己的机构群里貌似多了几条信息。又要补什么材料？真烦啊，好不容易出来玩一天就不能轻轻松松的吗？然后我点开了群聊，看到了……很难形容我当时的心情，带一些苦涩又异常激动，一颗心里的石头终于落了地，又好像有其他的什么在继续缠着我。飞速点开，一封写着自己名字的conditional offer出现在面前，我才好确认这一切都是真实的。我终于有底气继续等了！这就是我当时的第一想法。爱丁堡固然是一所不错的大学，QS排名27的同时，AL的单科排名更是全球第六，可谓享誉世界，也算是爱丁堡顶梁柱之一。但是，我心里对香港依旧充满执念。这一想法还是在持续影响着我——哪怕拿到了爱丁堡的offer，我也要继续等香港，那里才是我的归宿。另外一重担忧则是语言。我自知自己的语言水平去考到7（6.5）是一个相当大的挑战，当时也认定自己90%要去读语言班了（如果真的去英国）。当然，我也心有不甘，但接连3次考出6.5（5.5）也令我的自我怀疑达到了顶峰。我对雅思也达到了一种PTSD的状态。我妈当时劝我过年后去考一次试试，哪怕裸考，我就用各种理由推辞了，我也知道自己在逃避，但我考试有个标准：“不打无准备的仗”。既然过年期间自己还要准备考专八，那就没时间准备雅思，即使考了也不会过的，早晚要考，不如晚点准备准备再上。我如是想。之后，3月19日，我收到了澳门大学的面试。虽然明知道自己大概率不会去了，毕竟这个260名和27名的alternative摆在这里的话，我想做抉择就像是要去清北还是济南大学一样简单吧，但我还是参加了面试。虽然依旧紧张，但全英文的沟通还是可以应付得了。四年积累的经验让我稍微结结巴巴地捱过去了。唉，什么时候我才能争气点呢，面试完之后我也止不住叹息自己很糟糕的口语水平（其实还好，只是我本人不够满意）。继续等吧，机构说3/4月就是香港下offer的高峰期，哪怕等不来我还有爱丁堡一张王牌，哪怕语言不够我也可以考虑语言班不是？雅思，等等再说吧。不过，我的想法和计划很快就被彻底打乱了。2025年3月26日，上午例行查邮件时，一封offer突然闯入我的视野中。是墨尔本大学的两年制应用语言学硕士，说实话，我丝毫没想过“Being assessed”的我会被捞起来。此时，我虽然非常高兴，但我还是对澳洲没什么想法。直到我突然想起导师Alice和我说过的一句话。“Leo，如果你想继续深造PhD的话，那我推荐你去读两年的MA而不是一年的。因为两年最起码可以做出一些成果来，一年时间实在太短了，你来不及做什么就毕业了，等到毕业之后申请PhD基本上还要再gap，会有些浪费时间。”我当时听到这句话时，是Alice正在给我分析澳门大学的一些好处。不同于英、港、新，澳大的英语研究是两年制硕士。要说澳大的排名低，那的确是绕不开的短板，但相对于英港新，澳大最大的好处就是它的学制对于申请PhD的学生来讲实在是值得心动，以至于哪怕我收到爱丁堡的offer，也不住在想着澳门大学的事情，也不想百分之百放弃它。现在，到手的机会这不就来了吗？墨尔本的AL就是两年制不说，墨大本身也和澳洲其他的大学能够拉开断档，算是澳洲少有的难申请的大学，学术声誉也是一等一的好。论及排名，虽单科排名确实不如爱丁堡的AL全世界第六，但墨大13名的综合排名却比爱丁堡还高一截，在自己被UCL和新国立接连拒绝后算是自己能申到的排名最好学校了，没有之一。于是，我开始进一步了解墨大的AL。然而，随着调查，我开始发现事情没那么简单。第一，墨大要求4月16日前就要accept或是decline这封offer，那天是3月26日，这意味着时间并不多。第二，我4月16日肯定还没毕业，就意味着我要接受的话就一定要先换con coe出来。第三，要换con coe，我就一定要满足它的语言要求，因为墨大明确提到了，con coe是只有条件仅剩下毕业一个时才可以发下的。那么我能得到的结论就只有——我必须在4月16日前满足墨大的语言要求，才有资格去入学，否则，我只能被迫decline好不容易才到手的这封offer。当时，我正在面临专八考试，也就是3月29日。随之而来的是Reading Week，我想这就是我唯一的机会了。裸考吧。管他娘的考过考不过，算逑。专八考试结束，我便火急火燎前往深圳。是的，哪怕自己学校里有考点，但这个让我失败了三次的地方我实在是产生了极大的阴影。既然正好是Reading Week，不如直接去深圳考一场吧，考完再去朗玩好好玩玩，我如是想。于是，我这个J人做过最P的一件事来了，这场临时起意的考试，在上午的口语就给了我狠狠一记闷锤。口语是我考前唯二准备的东西，但当天考试从Part 2开始就是我准备范围以外的东西了。好在我Part 2有惊无险地过了，但随之而来的Part 3抽象问题给我一问一个懵，越往后面我就越像个人机一样呆呆怔怔半天也组织不起像样的答案。完了。走出考场，我脑子里闪现的就两个字，整个人软趴趴地像一具行尸走肉一样漫步在华强北。深圳迎来了难得的好天气，气温刚好适宜出游。我记得那天深圳中心公园里散步的人特别多，但我一点看风景的心情都没有。“妈。”“考完了？”“嗯。能说几句吗？”“嗯，我听着。”“完了。”“怎么呢？”“口语完蛋了。人家问我问题，我都答不上来。”“……”“我下午不考了。口语烂成这样，我已经失败了，5.5都拿不到！”“孩子，我理解你，你如果不想考，我们也不会有任何意见，但你还是建议你去考一考试试，哪怕涨涨经验呢？”“……”我心里还是有动摇的，但我已然觉得自己失败了。这次失败就意味着我放弃了墨大的offer，放弃了爱丁堡语言通过的机会，放弃了去给香港补语言成绩的机会。但最后，谁知道呢！也许是我妈几句话的作用，也许是自己真觉得无所谓了，下午我还是按时走进了考场。“随便了，爱过不过，反正这次我也一点都没准备。”戴上耳机，听力部分开始后，我却发现电脑上的这些题目好像没这么难了。以前，我听力是笔试中最薄弱的环节，这次，由于我没啥执念了，我就当是玩一样，遇到听不到的空我就直接放过不纠结了，结果，整个四篇下来，自己发现好像做得还行。阅读更是抽到了自己专业的Language diversity，哪怕是细嚼慢咽四篇做完也还剩下10分钟，作文上来我就开始直接套专八作文用过的几个模板，结果也发现还挺好用的。出了考场，我整个人有点哭笑不得，因为这三科考得太顺了，但我又想，反正口语砸了，其他科考得好又有什么用呢？时间来到三天之后，我当时还在上课，打开雅思网站，我的第一反应是，我是不是登错账号了？这是不是别人的成绩？再一看，自己的！口语竟然也有6.5，其他呢？其他竟然也并没有低于6.5的，总分还到了7！我也是激动地差点没从椅子上蹦起来，这种痛……真的只有鏖战过雅思的人才知道。三战三败，已经让我产生了巨大阴影，第四战，如果我选择了逃避下午的考试，我不会得到任何什么，但我还是去面对了，并拿到了最好的结果。这下，爱丁堡的语言班可以直接豁免了，墨大的语言条件也满足了。现在摆在眼前的只剩一件事了。在香港继续0 offer的局面下，墨大，接，还是不接。在那之后，我又和有申请经验的堂姐、身边的同学、Alice和之前的TA都聊过了，得到的答案都出乎意料的一致。若以深造PhD为前提，墨大无疑是最好的选择。一是两年制的学制更适合长线发展，二是两年的时间足以和墨大的导师线下套磁，获取读博的机会。据导师说，澳洲读博的机会不仅比香港多，申请到全奖的机会也相对较多，申请难度也没那么高。在和家里反复磋商之后，我最后真的选择了墨大。从香港、英国，辗转世界的offer旅程，墨大这个结果是我无论如何都想不到的，但我也不后悔，只希望这对我未来的前景能够有所帮助。加油吧。
【实用软件记录-01】Chrome-iTab 无广告、一应俱全的新标签页体验
新开一档栏目，简单记录一下自己用过的、还算实用的各类插件和工具。iTab【分类】浏览器插件【功能】规范化新标签页【广告】无【会员】无【成本】0【下载途径】Chrome插件商店，或访问官网。（以下为官方介绍）iTab新标签页是一款新型的小组件式浏览器插件，用于美化和管理浏览器主页，优化浏览器使用体验。它集成了一系列实用的小组件，包括热搜榜，日历，天气预报、打工倒计时，网页书签等，旨在提高用户的浏览效率。功能包括：小组件，网页收藏，聚合搜索，自定义壁纸，极简模式，跨平台数据同步，界面无广告。我是在一个B站up的教学视频里偶然看到这个插件的，加上有人在弹幕里提到了“iTab”，就好奇地搜索试用了一下。用下来不到半天就感觉自己很爱。我的点主要在于它的widget和网址分类做得相当不错，再加上动态壁纸的一丢丢加成，让新标签页的功能和美观程度都丰富起来了，很难不爱。
I 流星雨白雪覆盖了残断的四肢、四溅的鲜血和被炮火覆盖的一张张失去生气的脸……在倒塌的废墟中，在身后远处的喊杀声中，一众人吃力地走着、甚至是爬行着前进。男人是这一众人里再平凡不过的一个，随着他一起的，是他的妻子和两个孩子。拖沓着脚步，沉重的行李和严重的睡眠不足为这个男人戴上无形的镣铐，长途跋涉和艰险的路途让男人身上只剩一件单薄的外套——他把自己破旧的棉袄给了自己的妻子和孩子。男人的脚早已浮肿冻伤，充斥着麻木，胳膊上被剐蹭的血迹已经结了痂。不过，眼前的景象总归还是让他从充血的双眼中挤出了一个干瘪的笑容。东方的天蒙蒙亮，然后在下一刻，所有人都停下了前行。在遥远的地平线，朝阳伴随鸟儿的叽喳一跃而出，它先是照亮了一幢宏伟墙壁的一个角落，然后为一整座墙镀上了金边。这里是王城的门前。在相反的方向，天空还是铁青色的。男人回想起他的那片田地和那栋小房子。在小国的边陲，一片田地就是这个男人所有的资产，不过他以勤勉著称，日出而作日入而息的辛苦劳作也足以支撑自己的生活。每逢周六，他就会和边境上经商的商人换些必需品，有时手头宽裕，还能换些花瓶之类的廉价装饰品和一些不常见的书籍，因此自己也算是这边陲小镇上少有的知识分子。几年前，他结婚了，妻子的出身也不富裕，两人却十分情投意合，诞下了两个小孩。在某个周六，他和妻子一如往常来到交易市场，却发现边境上的商人消失了，一片热闹的走廊只剩下空荡的摊位，替代那群商人的，是赫然出现在市场的士兵。他有点懵，也还记得那天的朝阳，它安静地升起。除了鸟儿的啁啾，没有任何声音。他和妻子好像一头扎进了一片密林中，在广阔的田野里却找不到任何方向。他也记得那天朝阳下西边的天空，不仅是因为那种铁青色，还因为他看到了黑压压一片的人——确切地说，是和自己国家穿着不同的士兵。当黑点越来越近，男人虽然仍未搞清现状，却也不傻。他拉起妻子，拔腿就跑。如洪流一般的攻势没有给他们太多的准备时间，他们只能打包一些最紧要的行李，但更关键的问题是，向哪里逃呢？他只知道，书中写着，朝着太阳升起的地方一直走，就能走到这座宏伟的王城。那位好心的国王承诺他们，一有战乱，所有国民——不论贵贱都有权利得到王城的庇护。现在，经历了数百里的风餐露宿，他们看到了它的轮廓——好像在晨曦中有些模糊不清，如同一幅被时间侵蚀的旧画。城墙上的缺口诉说着炮火的洗礼也覆盖了这里。远处花花绿绿用破布和细木条支起来的帐篷覆满了城门前的空地，他看到了分发汤羹的一行人从城门走出，他们立即被饥饿的人群围住，守卫上前试图制止混乱，却无济于事。在一片拥挤中，男人拿起几个碗和桶，嘱咐他的妻子和两个儿子在远一点的地方等他。他则奔跑着拥上前去，和那群人融为一体。喧嚷的人群把他团团围住，他嗅到了饭香和其他人身上的恶臭味，艰难地往人群簇拥的方向挤过去。很快，他觉察到人群的喧闹暂停了，本想靠着这个机会靠近分装汤羹的桶，他和人们却统统被天空中的景象摄住了心魄。——那是从白日落下的流星吗？不，显然不是，这些划破天际的“流星”燃着火焰，发出战马般的嘶鸣。此时人们才认出，这是投石炮的炮弹。随着第一块石头落地，人群迅速啸叫起来，向着城内拥去。他也被混乱的人群裹挟着，被人推搡着朝着城里移动。他大喊着家人的名字，试图逆着人群的方向移动，但充斥着恐惧的人组成人潮，将一切生存的本能都释放在了一个目标上：回城。从天而降的火球一点点靠近城池，远处的人们被吞噬。城门关上，远处的投石却不曾停止。城门前的小径上站满了逃难的人群和受伤的士兵，他们有的身裹白布，有的遍体鳞伤，正在接受治疗。男人一边有些吃力地穿过一道道人墙，一边大声呐喊着妻子和儿子的名字。他不相信，他们都走到了城门边上——走到了成功之门扉的边缘，怎么可能会在这里失败？投石的声响逐渐平息，直到人群安静下来。男人未能得到期待的回应，于是不可抵挡的疲倦席卷着巨大的恐惧和悲恸如潮水般涌上脑海，男人直感觉一阵眩晕和脱力，随后，地面成了天空。男人倒下了。II伴随一身冷汗，男人喘着粗气醒来了。眼前是有些熟悉的屋顶，还有……男人的瞳孔瞬间缩小了。“亲爱的，你的梦呓又发作了，没事吧？”几乎是下意识地，他立刻抱紧了她。惊喜、悲伤和犹疑一瞬间冲昏了男人的大脑，眼泪从他眼中簌簌而下，他顾不上妻子疑惑的神情，只是抱着她不肯松手。眼前的一切都是那么熟悉，无疑，这里是他的家。“亲爱的，虽然我不知道你梦到了什么，不过别害怕，不管有多可怕，梦里的一切都不会成真的。”妻子拍着他的背，温柔地说道。那片流星雨和猩红的天空又一次袭上他的脑海……难道那才是梦？他不禁想着，但那未免也太真实了。来到前厅，早饭已经备好，他的几个孩子也已经上桌，相互嬉闹着。他掀开墙上的日历。8月9日男人愣了一下，这个上一秒还在数九寒天的男人好像被整个世界的蝉鸣声占满了他的大脑，然后是盛夏热腾的气浪，然后是……直到妻子摇了摇他的肩膀，他才一瞬间恍过神来。来到桌子前，他看着桌上的早饭，除了普通的面包，还有妻子特地为他准备的草药汤，每次他做噩梦起床的时候，妻子就会为他摘些田里种着的镇静精神用的药草。他看到窗台上依旧摆放着自己淘来的那些旧玩意儿，不过，好像少了什么东西。是什么呢？男人似乎也不记得了。这一定也不重要，他想。坐回餐桌旁，男人望向桌上的早餐，又望向等他开饭的妻子，他们对视的眼眸中藏着一汪大海，男人却感到一阵莫名的悲伤，不过很快，他便放弃了追寻这悲伤的来头。那小小的梦魇很快便被男人抛之脑后了，随之而来的便是生活的日常。日出而作，日入而息，如此往复，直到第七天。伴随着旭日初升，男人起床了。窗边，他看到万里火烧云后的朝阳，向大地致以金色的敬意。他回到仓库，简单用过早饭，拿好农具，准备出门时，一个小小的身影正坐在门前。“爸爸，今天早上的云彩好漂亮啊。”男人笑了笑，刚想问儿子怎么起床这么早时，大脑突然开始嗡嗡作响。那轮金色的旭日，仍藏在万丈云彩身后；更精确地说，它的位置和半小时之前完全没有变化。男人下意识地望向身后的挂钟，那根指针果真停止了转动。“爸爸，快看天上，是流星雨！”孩子的话语打断了他的思考，白天怎么会有流星雨呢？但事实便是如此，那些耀眼的白光离他们越来越近了，细细的轨迹变成了一个个大火球，伴随着像是烧开水的“嘶嘶”声。他看到太阳从云中蹦出来，照耀着远处那堵陌生的城墙；家里挂钟的指针也一瞬间走了起来，或者更准确地说，是像坏掉了一样飞速流转。火球接近了，太阳快速升上了天空，然后是正午。随着第一枚火球砸向地面，男人下意识地抱住自己的孩子，但无济于事。成百上千颗火球呼啸而来，很快四周便充斥着火光。很快，男人只感到脑中一阵痛苦的扭曲，仿佛自己掉入了意识的深海，所有记忆都浮现出来，又离他而去，像是被无形的手牵引着的提线木偶……III伴随一身冷汗，男人在一片混沌中再次醒来，发现自己又回到了最初的那一天。“我还在梦中吗……”男人喃喃自语。窗外的鸟鸣和妻子温柔的呼唤声让他一度以为之前的经历不过是一场噩梦。然而，当他看到日历上的日期时，他的心猛然一沉。所有的细节都与那天一模一样——他知道，这一定不只是简单的梦境。他意识到自己好像被困在一个奇异的循环中，每当流星雨降临并夺走他的家人后，他就会重新回到这一天。在第二个七天里，他决定尝试改变命运。他开始注意周围的一切，试图找出任何可能的线索。他告诉妻子和孩子们不要出门，试图保护他们免受即将到来的灾难。然而，当流星雨再次降临时，他发现自己的努力都是徒劳的。无论他如何努力，家人总是在第七天被无情的火球吞噬。随着循环的不断重复，他不得不面对一个残酷的事实：这是一场永无止境的噩梦。随着循环的增加，男人的精神状态开始变得不稳定。他开始怀疑自己的记忆，甚至开始质疑自己的理智，脾气也变得暴躁和易怒；他还尝试过与其他人交流，希望从他们的言谈中找出梦境的蛛丝马迹。他询问镇上的人们，试图找出更多关于“流星雨”的信息，但得到的回应总是模糊不清，仿佛所有人都被笼罩在同样的梦境中。不知过了多少次循环，男人已经来到了崩溃的边缘。当他发现自又一次回到了8月5日的清晨，他开始抄起手边的物什，砸向窗边的花瓶。但在砸到花瓶前的一个瞬间，男人的手戛然而止。在花瓶旁，一个异样的摆设吸引了他的视线，那是半截紫色的琉璃花朵，透明的色泽反射着神秘的光辉，而另外半截不知所踪，整齐光滑的切面仿佛说明这朵琉璃花从来都只有半朵。但它骗不了男人的直觉。那已经模糊不清的记忆可以异常明确地告诉他，自己在前几次循环中从来没见过它。他刚拿起那半截紫琉璃花想要细细端详，大脑却像一下子吃了一记闷棍，一些记忆像是开闸泄洪般流入脑海。他上半身强直着面向太阳，直直地跪在了地上，像个领受神谕的信徒。他回忆起自己在很久前的农闲时在镇上听过一个讲座，那人身穿白色大褂，衣冠楚楚，一看就是上流社会的人，这种人在他们的小镇上并不多见，他见那人站在镇上的广场中央，神采奕奕地讲着什么，便走过去听。因为自己闲暇时还喜欢读些书，他能回忆起那次讲座的内容是有关一种叫做“Temiar Senoi技巧”的东西——一种通过清醒梦控制梦境的方法。他不知道这个词为什么突然出现在自己脑海里，好像那个人就是Temiar Senoi的化身。但总之，临走时，那个男人给每个在场者都发放了一朵小小的紫色琉璃花。“紫色的花，这在我们这里是不祥之物，我们不需要！”大多数人都直接拒绝了这件小礼物，但男人收下了，他还记住了那个白大褂脸上神秘的笑容。“叫我摩尔（Mor），先生。谢谢您的理解，相信这东西会给您带来好运，也希望您永远不会真正用到它。”白大褂和男人握了握手，微笑着离开了。“哼，故弄玄虚的人，但总归能换点钱。”拿着这朵琉璃花，男人默默想着，但回家之后就将它放在了窗台上，之后就好像忘了这码事……男人在恍惚中回过神来，发现被焦急的妻子摇晃着肩膀，她以为丈夫着了魔，声泪俱下地喊着男人的名字，让他丢掉这个“不祥之物”。男人安慰了妻子，拿着半朵紫色琉璃花，坚持自己一个人走出了家门。他循着记忆来到广场前，在草丛中寻找着什么。很快，男人找到了他想要的那一抹特别显眼的紫色光辉——那是另外半截琉璃花。他拾起那半截花瓣，试着与手中的拼接起来。随着男人的拼接，裂缝消失了。男人的心跳如擂鼓，手中紧握着那完整的紫色琉璃花，仿佛它是打开梦境谜团的钥匙。身后的声音让他猛然转身，那个身穿白色大褂的男人静静地站在那里，微笑着看着他。“向您致敬，先生。”IV“摩尔……”男人喃喃道，记忆的碎片迅速拼接成完整的画面。他想起了那次讲座，想起了摩尔神秘的笑容，以及他手中这朵琉璃花的来历。“是的，我是摩尔。”白大褂点头，向他走近，“智慧的先生，我想你已经意识到自己身处何地了。”“这是一个梦……一个循环的梦。”男人声音颤抖，心中充满了疑惑和一丝希望，“你能帮我吗？救救我的家人。”摩尔漏出一丝轻笑，他伸出手，轻轻触碰了男人手中的琉璃花。刹那间，四周的景象如同破碎的镜子般崩溃，化为无尽的虚无，只剩下他们两人漂浮在这片空白之中。“欢迎来到‘琉璃梦’计划。”摩尔微微一笑，男人手里便多出一张名片，上面印着“X科研所 研究员 摩尔（Mor）”。“这个计划原本是为了帮助人们通过清醒梦技术体验现实中无法实现的愿望。但在战后时期，这项技术被应用于治愈精神创伤，却在你的梦境中出现了差错，导致这种永无止境的悲剧循环。”“所以，我的家人……”“他们在现实中已经不复存在。”摩尔的声音仿佛轻地失去了感情，“但在这个梦境中，您仍有两个选择。要么立即终止梦境，回到现实，那么尽管琉璃梦对您不奏效，却最起码不会致使你的肉身泯灭；要么继续尝试在重复的悲剧中找到一线生机，带领家人逃出循环——”摩尔顿了一顿，仿佛在观察男人的反应，随后继续说，“但我必须警告您，梦境的多次重复可能改变您的精神状态，最终让你无法分清梦与现实的边界。尤其是每次循环的结束都以‘死亡’作结，这就意味着您可能在以为是梦境的现实中真正死去，或者因为严重的精神打击而永远昏迷，变成植物人。而且，即使您在梦中成功解救了家人，现实中您的家人们也回不来了。”男人闭上眼睛，他想起那些在流星雨中消逝的笑脸，想起妻子的温柔和孩子们的嬉闹。他知道，哪怕只是在梦中，他也不愿放弃。“我选择继续。”男人睁开眼睛，握紧了拳头，“在现实中，我失去了我的故乡、我的财富，还有我最重要的家人们。但，最起码，在这里我还有机会夺回来——哪怕他们不是真的。”摩尔严肃的嘴角微微上扬，他思绪良久，缓缓开口说道，“很好。既然这是你的选择，我就没有干涉的理由。您还记得手中的这朵琉璃花吧，那是我说过，希望您不会真正用到它。”“我记得……我刚刚记起来了。”“事实上，这是一枚特制的信物，它的作用就是储存一些特定的记忆。”摩尔说，“现在，先生，它已经让您回忆起了您应该知道的线索，拿起这朵琉璃花，去面对摩尔普斯的光辉吧。”话一说完，男人手中的琉璃花开始发出紫色的光辉，一句话直接进入了他的脑海：‘名为[摩尔普斯(梦神)]的光辉普照梦的每一寸大地，但即便如此，也总有戴着面具的、不愿面对梦的愚者。面对这些愚者，我们的神给予智慧的宽恕。’”待男人回过神来，纯白色早已消散，而摩尔也不见了踪影。V第七天，如约到来了。男人一夜没睡，在黎明，他叫醒了所有人。“我们要去一个安全的地方，”他对孩子说，试图掩饰声音中的颤抖，“这是一场冒险，地窖就是通往异世界的入口。”孩子们兴奋地看着他，天真地问：“真的吗，爸爸？我们真的要去异世界吗？”男人勉强挤出一个微笑，“是的，孩子们，这会是一次特别的冒险。”“如果你只是说这些疯话，那我们就要回去睡觉了。”妻子有些不满地看着男人。“请相信我，这是为了‘救赎’。”男人几近绝望地低声说，“亲爱的，我只能告诉你，我们会有危险，除非照我说的做……”妻子望着他，眼中流露出一丝不解和隐约的担忧。“亲爱的，你这几天一直有点……怎么说，像是着了魔一样。你……一定在经历什么吧，但我……我还是愿意相信你。”她轻声回答，温柔地握住他的手，“无论这场‘梦’意味着什么，我都会陪你走下去。”当她下意识地吐出“梦”这个字时，她自己和男人都有些愣住了。“为什么，我会说这是‘梦’呢？……”“时间不多了，跟我来吧。”东方的天空已经开始发白，男人知道，那个命定的时刻就要来了。流星雨如约而至，猛烈的震动让地窖的砖块开始松动。男人用宽大的身躯护住家人，紧张地等待着一切结束。很快，震动平息。男人打开了地窖的门——妻子和孩子只是被突如其来的天灾震晕了，这令他大喜过望。他知道，自己已经参透了那句暗语。“愚者”不愿面对梦境，而神就会给予“宽恕”。也就是说，他只需要“骗”过梦境，让梦境以为他们按照剧本死亡了，梦境就会饶过他们。他把妻子和儿子搬到家里，果然再没有第二波流星雨会降临了。很快，小儿子费劲地睁开了眼睛，他看着男人，说道：“爸爸……我在哪……现在是什么时候……”“亲爱的，你就在家里，”男人激动地说，回头望向墙上的挂钟。一瞬间，他的瞳孔震荡起来。男人走近了挂钟，已经上满发条的它，如今一动不动。“这……这是……”“爸爸，快看天上，是流星雨……”恐惧和愤怒在男人心中蔓延，“白大褂的混蛋……！你骗了我！”然而呐喊无济于事，迎接男人的，只有再次加速流转的时间，和纷至沓来吞噬最后希望的火球。VI当下一次循环开始，男人拿着琉璃花来到广场，发现摩尔就背对着他站在广场中央。“你这个混蛋！你凭什么玩弄我的信任和感情，还用我家人的命来陪？！”男人大声质问道。“先生，我没有骗你，梦境的光辉平等地笼罩一切。”摩尔冷静地说道，“而您只是还没有找到正确的方法。”“正确的方法？是要我解开你说的那个破哑谜吗？”“没错，先生。但谜底总是要由梦境的主人——也就是您亲自得出的。我和同僚身为梦境的观测者，只能通过我们的技术进行外部观测，在每次循环后积累经验，把合适的脑波具象化成文字的提示，因为我也不知道谜底究竟是什么。”摩尔顿了顿，“但先生，这次的提示似乎更加简洁，或者说，直接。”说罢，男人手中的琉璃再度发光，一句话再度进入了他的脑海。“愚者有罪，惟有牺牲，方得救赎。”……第七日，当流星雨再度降临，男人已经下定了决心。在流星雨来临前，他依旧说服了家人躲进了地窖——这样最起码能够躲过第一波。他拖着妻子和孩子爬出地窖，才发现自己这次也不知为何受了重伤。一口鲜血从嘴里涌出，洒在妻子身边，看起来就像是她受了重伤。突然间，他明白了摩尔的暗语：“惟有牺牲，才有救赎。”一丝犹豫过后，男人果断地用刀划开了自己的腹部，鲜血奔涌而出，洒在地上，营造出一副家人惨死的假象。他知道，只有这样才能骗过梦境的规则。很快，第二次流星雨的时间到了，但没有发生任何事情。男人向着天空哈哈大笑，笑声中夹杂着解脱与悲怆。然而，伴随着失血过多，他的意识逐渐模糊，最终晕倒过去。当他再次醒来时，妻子和孩子们簇拥在他身旁，他们的脸上满是泪水和惊喜。他感受到自己被抬到了床上，温暖的触感让他安心。在半梦半醒之间，他仿佛进入了另一个梦境。他看到那扇开放的城门，城门旁是一片无名冢，渐渐地，他的家人出现在他身旁。他们牵着手，含着泪一起进入了城门。VII 最终章在城墙边，隆隆的炮声还在不远处响着。这层王城最坚韧的护盾，正在用自己垂垂老矣的身躯拥护着王国最后的尊严。在满是战争难民的大街上，一位难民躺在简陋的床上，他身上裹着白布，刚刚被宣告了死亡，要被运往城墙边的无名冢。在他的手中，人们发现了一块被紧握着的精美的琉璃花饰物，和一张纸条。那块琉璃已经有了深深的裂缝，但仍然散发着淡淡的光亮。与之相衬的，则是男人微微上扬的嘴角，就好像永远沉睡在了一个幸福的梦中。那张小小的字条上，则端正地写了几行字：“琉璃之物，我原以为是清醒梦疗法的信物，治愈心灵的令使，而于你，则成为了现世之外的港湾，和临终的一丝曙光，你是一位勇者——梦境和现实都是，我很荣幸，见证了你的结局，见证了梦境的更深层含义。你真诚的，摩尔”琉璃梦 完
[scode type="share"]幼年时读季羡林季老的散文，其之于鄙人写作的影响极大。依稀忆起季老字里行间的那种用独特比喻和出的浓稠文墨，典雅而不矫饰，大概是鄙人追求辞藻堆砌的最开端罢。[/scode]寂寞文 季羡林寂寞像大毒蛇，盘住了我整个的心，我自己也奇怪：几天前喧腾的笑声现在还萦绕在耳际，我竟然给寂寞克服了吗？但是，克服了，是真的，奇怪又有什么用呢？笑声虽然萦绕在耳际，早已恍如梦中的追忆了，我只有一颗心，空虚寂寞的心被安放在一个长方形的小屋里。我看四壁，四壁冰冷像石板，书架上一行行排列着的书，都像一行行的石块，床上棉被和大衣的折纹也都变成雕刻家手下的作品了，死寂，一切死寂，更死寂的却是我的心，——我到了庞培（Pompaii）1了么？不，我自己证明没有，隔了窗子，我还可以看见袅动的烟缕，虽然还在袅动，但是又是怎样地微弱呢，——我到了西敏斯大寺（Westminster Abbey）2了么？我自己又证明没有，我看不到阴森的长廊，看不到诗人的墓圹 3，我只是被装在一个长方形小屋里，四周圈着冰冷的石板似的墙壁，我究竟在什么地方呢？桌子上那两盆草的蔓长嫩绿的枝条，反射在镜子的影子，我透过玻璃杯看到的淡淡的影子；反射在电镀过的小钟座的影子，在平常总轻轻地笼罩上一层绿雾，不是很美丽有生气的吗？为什么也变成浮雕般地呆僵着不动呢？——一切完了，一切都给寂寞吞噬了，寂寞凝定在墙上挂的相片上，凝定在屋角的蜘蛛网上，凝定在镜子里我自己的影子上……一切都真的给寂寞吞噬了吗？不，还有我自己，我试着抬一抬胳膊，还能抬得起，我摆了摆头，镜子里的影子也还随着动，我自己问：是谁把我放在这里的呢？是我自己，现在我才发现，就是自己，我能逃——我能逃，然而，寂寞又跟上我了呀！在平常我们跑着百米抢书的图书馆，不是很热闹的吗？现在为什么也这样冷清呢？我从这头看到那头，像看到一个朦胧的残梦，淡黄的阳光从窗子里穿进来造成一条光的路，又射在光滑的桌面上，不耀眼，不辉腾，只是死死地贴在桌上，像——像什么呢？我不愿意说，像乡间黑漆棺材上贴的金边，寥寥几个看书的，错落地散坐着，使我想到月明夜天空里的星子，但也都石像似的坐着，不响也不动，是人么？不是，我左右看全不像，像木乃伊？又不像，因为我闻不到木乃伊应该有的那种香味，像死尸？有点，但也不全像，——我看到他们僵坐的姿势了；我看到他们一个个的翻着的死白的眼了，我现在知道他们像什么，像鱼市里的死鱼，一堆堆地排列着，鼓着肚皮，翻着白眼，可怕！然而我能逃，然而寂寞又跟上了我，我向哪里逃呢？到了世界的末日了吗？世界的末日，多可怕！以前我曾自己想象，自己是世界上最后的一个生物，因了这无谓的想象，我流过不知多少汗，但是现在却真教我尝到这个滋味了，天空倒挂着，像个盆，远处的西山，近处的楼台，都仿佛剪影似的贴在这灰白盆底上，小鸟缩着脖子站在土山上，不动，像博物院里的标本，流水在冰下低缓地唱着丧歌，天空里破絮似的云片，看来像一帖帖的膏药，糊在我这寂寞的心上，枯枝丫杈着，看来像鱼刺，也刺着我这寂寞的心。但是，我在身旁发现有人影在游动了，我知道，我自己不是世界上最后的生物，我在内心浮起一丝笑意，但是（又是但是）却怪没等这笑意浮到脸上，我又看到我身旁的人也同样翻着死白的眼，像木乃伊？像僵尸？像鱼市上陈列的死鱼？谁耐心去管，战栗通过了我全身，我想逃，寂寞驱逐着我，我想逃，向哪里逃呢？——天哪！我不知道向哪里逃了。夜来了，随了夜来的是更多的寂寞，当我从外面走回宿舍的时候，四周死一般沉寂，但总仿佛有窸窣的脚步声绕在我四围。说声，其实哪里有什么声呢？只是我觉得有什么东西跟着我而已，倘若在白天，我一定说这是影子；倘若睡着了，我一定说这是梦，究竟是什么呢？我知道，这是寂寞，从远处我看到压在黑暗的夜气下面的宿舍，以前不是每个窗子都射出温热的软光来么？但是，变了，一切变了，大半的窗子都黑黑的，闭着寥寥的几个窗子，无力地迸射出几条光线来，又都是怎样暗淡灰白呢？——不，这不是窗子里射出来的灯光，这是墓地里的鬼火，这是魔窟里发出的魔光，我是到了鬼影憧憧的世界里了，我自己也成了鬼影了。我平卧在床上，让柔弱的灯光流在我身上，让寂寞在我四周跳动，静听着远处传来的蛩蛩4的足音，隐隐地，细细弱弱到听不清，听不见了，这声音从哪里传来的呢？是从辽远又辽远的国土里呀！是从寂寞的大沙漠里呀！但是，又像比辽远的国土更辽远；我的小屋是坟墓，这声音是从墓外过路人的脚下踶5出来的呀！离这里多远呢？想象不出，也不能想象，望吧！是一片茫茫的白海流布在中间，海里是什么呢？是寂寞。隔了窗子，外面是死寂的夜，从蒙翳的玻璃里看出去，不见灯光；不见一切东西的清晰的轮廓，只是黑暗，在黑暗里的迷离的树影，丫杈着，刺着暗灰的天。在三个月前，这秃光的枯枝上，有过一串串的叶子，在萧瑟的秋风里打战，又罩上一层淡淡的黄雾。再往前，在五六个月以前吧，同样的这枯枝上织上一丛丛的茂密的绿，在雨里凝成浓翠，在毒阳下闪着金光。倘若再往前推，在春天里，这枯枝上嵌着一颗颗火星似的红花，远处看，晖耀着，像火焰，——但是，一转眼，溜到现在，现在怎样了呢？变了，全变了，只剩了秃光的枯枝，刺着天空，把小小的温热的生命力蕴蓄在这枯枝的中心，外面披上这层刚劲的皮，忍受着北风的狂吹；忍受着白雪的凝固；忍受着寂寞的来袭，同我一样。它也该同我一样切盼着春的来临，切盼着寂寞的退走吧。春什么时候会来呢？寂寞什么时候会走呢？这漫漫的长长的夜，这漫漫的更长的冬……一九三四年一月二十二日注：本文节选自《季羡林散文集》，中国社会出版社出版，2011年版。 庞培（拉丁语：Pompaii），或译庞贝，为古罗马城市之一，位于那不勒斯湾维苏威火山脚下。 ↩ 威斯敏斯特圣彼得协同教堂（英语：The Collegiate Church of St Peter at Westminster），通称威斯敏斯特修道院（英语：Westminster Abbey，也常译为西敏寺），是一座位于伦敦市中心威斯敏斯特区的大型哥特式建筑风格的教堂，一直是英国君主（从英格兰、不列颠到英联邦时期）安葬或加冕登基的地点。曾在1546–1556年短暂成为主教座堂，现为王家胜迹。1987年被列为世界文化遗产。 ↩ 墓圹，读音是mù kuàng。意思是墓穴。 ↩ 蛩蛩，读音是qióng qióng。意思是传说中的一种异兽，怀忧貌。此处形容脚踏地的声音。 ↩ 踶，读音是dì，动词，用蹄子踢、踏的意思。 ↩
[hplayer][Music server="tencent" id="002wAxqc0RpVL5" type="song"/][/hplayer]一个不小的房间，这是男人的卧室。这个男人21岁了，他好像刚从睡梦中醒来。看了看表，下午2:25。还早呢。男人这样想着，不如来一把音游再走吧。——即便他已经知道自己手底下已经堆了干不完的活，这个自诩为90%的“J人”还是一如既往头也不回地将自己精心定制的计划束之高阁，打开了平板。那块平板是去年夏天换的，上一块平板的死状历历在目，不过男人没有理会，因为他手里的这块平板业已伤痕累累：钢化膜从一角裂开，一条裂缝顺着一朵花纹顺流而下，在镜头边角画了一个三角形；屏幕中央偏下的特定位置，那里的疏油层已然脱落，即使是隔着钢化膜都能看到几个像是油手印的痕迹，好像和野兽近身缠斗过；屏幕边框更是惨不忍睹，一侧已经向下微微凹陷，使得屏幕和背板之间生出一道罅隙……男人没有在乎这些，正如他起初向父母请求买平板时的动机是生产力那样，一切的一切都是对自己过去承诺和行动戏谑的奚落。就打一两把9的小歌1就走。男人想着，点亮屏幕，熟悉地跳过生产力页面来到最后一页，那里罗列着自己玩过的所有音游。打开Arcaea，男人的手指蠢蠢欲动。要不打两首难的吧？男人似乎觉得自己状态不错，毫不犹豫地打开了新绿包2，看着自己F0C73的成绩，男人想着，不然今下午先试试能不能全连1首吧！两点四十，男人打开了第一首歌，那首9+难度的歌曲。然而天不遂人愿，男人似乎总在某些相同的地方出错，有好几次眼看就要FR了，或者难点过了，却总在后面的某个不经意的点漏掉。男人并没有注意时间，他只觉得暴躁。他扯着嗓子大吼起来，好像在咒骂谱师为什么写得这么难，又像在骂自己无能。继续打，男人迟迟没有获得自己想要的成绩。越往后，他越暴躁，每逢一个漏击他都要把嗓子喊哑，用拳头哐哐猛捶平板，好像这是平板的错。音游就像一把钥匙，可以导引男人的心灵挣脱正常人的范畴，并打开一个名为“野兽”的开关。渐渐地，这个21岁的男人忘了时间，或者说不在乎时间——他已然决定，自己不打出像样的成绩就不走了，哪怕自己一开始只说小玩几把。很快，男人起床一小时了，他知道自己早已经过了计划中要去自习室的点，但他还是磨蹭在卧室书桌前做着无用功。每逢不顺意，他就要像猩猩那样捶胸顿足、大吼着想要撕碎平板。最后，几乎像他每次碰音游那样，他崩溃了。毫不意外，他把这块叙利亚战损版的平板掷了出去，平板的一角着地，做了一个后空翻，沉默不语的屏幕倒映出男人喘着粗气的脸，钢化膜上的裂痕又把男人的面庞撕成两半，像是案板上对切的小米辣。很快，男人眉毛的倒八字变成了正八，极度的冲动之后，带来的是一种满溢着悲伤的扭曲痛苦，这种无法控制的痛苦将男人拉下万丈深渊，其中好似杂糅着冲动的悔恨、对自己无能的厌恶、打破计划的愧疚和对虐待平板的悲哀。一锅乱炖的混合汤汁刚刚出锅，便要整锅浇在男人头上，很快便把男人的情绪从顶峰扯至低谷。男人只感到一阵不受自控的脱力和来自心脏的悲鸣。他太熟悉这种感觉了。几乎每次打过音游都是这样的结局——他到底做错什么了？起初不都是为了快乐吗？为何打至最后总要到这步田地呢？有点太过火了。男人捡回了平板，他望着这块屏幕，想起了上一块平板的惨状——大抵与现役的这块情况一致。一股冲动从心中升起，不过这次，好像有变化。男人开了锁，还是跳过了生产力，来到了音游区。不过这次，他按住了那个熟悉的图标。“确定要卸载吗？”……做完这些，望着空荡荡的文件夹，男人松了口气。他知道他的生活已经离不开音游，但，为什么不能给自己一次就此别过的勇气，哪怕是一阵子、一段时间——嗯，足够到冷静下来，足够到有时间自我反思，或许足够到找回别的爱好兴趣，譬如那个捧着书的自己，抑或那个握着钢笔的自己，还有骑在Gravel上的那个自己，哪怕是站在街机前的自己，也比冲着平板大吼大叫的这个自己要强得多了。果断穿戴好衣服，拿起电脑和背包，男人走出了家门。时针指向3:40，距离男人起床已经一小时十分钟。锁上门，男人跳上了电动车。男人突然想写点什么。他在路上风驰电掣，一边想着。不然题目就叫，所以我放弃了音游吧。男人暗自点点头，走进了自习室，打开了电脑屏幕。四点整，自习开始了。 指游戏Arcaea中等级为Future 9的普通歌曲。 ↩ 指Arcaea在2024年7月底推出的新曲包：Absolute Nihilism，因为曲包剧情的主角咲彌的主题色是绿色，又因为是以其为主题推出的第二个曲包，故名。 ↩ F0指的是曲包内歌曲Full Recall（全连，FR）的数量为0，C7指的是Track Complete（通关，TC）的数量为7.这个曲包一共7首歌，所以F0C7的意思是7首歌全通关但没有任意一首是全连成绩。 ↩
Python(6): 文件及IO操作1 文件1.1 概述存储在计算机的存储设备中的一组数据序列就是文件。不同类型的文件通过后缀名进行区分。在Python中，文件被分为两类：①文本文件；②二进制文件。1.2 文件的基本操作打开/创建文件：name=open(filename,mode,encoding)filename: 文件名mode: 打开模式（详见下表）打开模式说明r以只读模式打开，文件指针在文件的开头，如果文件不存在，程序抛异常rb以只读模式打开二进制文件，如图片文件w覆盖写模式，文件不存在创建，文件存在则内容覆盖wb覆盖写模式写入二进制数据，文件不存在创建，文件存在则内容覆盖a追加写模式，文件不存在创建，文件存在则在文件最后追加内容+与w/r/a等一同使用，在原功能基础上增加同时读写功能encoding: 编码模式若文件名在目录中未创建，则会自动创建一个文件，不会报错。操作文件：① name.read() 只读② name.write(s) 覆盖写入读写方法说明file.read(size)读取指定字节的字符，若无参数则读取全部，结果为字符串类型 括号中为所读取字符数，而非字节大小file.readline(size)读取一行数据，若给定参数，则读取改行指定字节的字符，结果为字符串类型file.readlines()读取全部内容，结果为列表类型file.write(s)将字符串s写入文件file.writelines(lst)将内容全部为字符串的列表lst写入文件file.seek(offset)改变文件操作指针的位置 注：指针默认位置为文档首端，括号中为字节大小 （英文=1B，中文GBK编码=2B，UTF-8编码=3B）关闭文件：name.close() 1.2.1 例11.1：文件的基本读写def my_write(): # 定义函数 # (1)（创建）打开文件 file=open('a.txt','w',encoding='utf-8') # (2)操作文件 file.write('The Great Chinese Dream') # (3)关闭文件 file.close() # 读取 def my_read(): file=open('a.txt','r',encoding='utf-8') s=file.read() print(type(s),s) file.close() # 主程序运行 if __name__ == '__main__': my_write() # 调用函数 my_read() 1.2.2 例11.2：文件的写入操作def my_write(s): file=open('b.txt','a',encoding='utf-8') file.write(s) file.write('\n') file.close() def my_write_list(file,lst): f=open(file,'a',encoding='utf-8') f.writelines(lst) f.close if __name__ == '__main__': my_write('伟大的中国梦') my_write('北京欢迎您') my_write_list('c.txt',['姓名\t','年龄\t','成绩\n','张三\t','30\t','98']) 1.2.3 例11.3：文件的读取操作1.2.3.1 全部读取（第7行）def my_read(filename): file=open(filename,'w+',encoding='utf-8') # 'w+'兼备写入和读取功能 file.write('你好啊') # 写入完成，指针在最后 file.seek(0) # 把指针置于最前端 # 读取 s=file.read() # 读取全部 print(type(s),s) file.close() if __name__ == '__main__': my_read('d.txt') 1.2.3.2 读取指定字符数（第7行）def my_read(filename): file=open(filename,'w+',encoding='utf-8') # 'w+'兼备写入和读取功能 file.write('你好啊') # 写入完成，指针在最后 file.seek(0) # 把指针置于最前端 # 读取 s=file.read(2) # 2指的是两个字符，而非字节 print(type(s),s) file.close() if __name__ == '__main__': my_read('d.txt') 1.2.3.3 读取一行数据（第7行）def my_read(filename): file=open(filename,'w+',encoding='utf-8') # 'w+'兼备写入和读取功能 file.write('你好啊') # 写入完成，指针在最后 file.seek(0) # 把指针置于最前端 # 读取 s=file.readline() # 读取一行数据 print(type(s),s) file.close() if __name__ == '__main__': my_read('d.txt') 1.2.3.4 读取一行数据的指定个字符（第7行）def my_read(filename): file=open(filename,'w+',encoding='utf-8') # 'w+'兼备写入和读取功能 file.write('你好啊') # 写入完成，指针在最后 file.seek(0) # 把指针置于最前端 # 读取 s=file.readline(2) # 读取一行数据的两个字符 print(type(s),s) file.close() if __name__ == '__main__': my_read('d.txt') 1.2.3.5 读取所有行（第7行）注意：与以上不同，readlines() 括号中的数字表示行数，输出为列表类型。def my_read(filename): file=open(filename,'w+',encoding='utf-8') # 'w+'兼备写入和读取功能 file.write('你好啊') # 写入完成，指针在最后 file.seek(0) # 把指针置于最前端 # 读取 s=file.readlines() # 读取所有行数据 print(type(s),s) file.close() if __name__ == '__main__': my_read('d.txt') 1.2.3.6 通过移动指针读取部分内容（第5行）def my_read(filename): file=open(filename,'w+',encoding='utf-8') # 'w+'兼备写入和读取功能 file.write('你好啊') # 写入完成，指针在最后 file.seek(3) # 把指针置于第一个字后，即3个字节后 s=file.read() print(type(s),s) file.close() if __name__ == '__main__': my_read('d.txt') 1.2.4 例11.4：文件复制（图片为例）def copy(src,npath): # 文件的复制就是“边读边写”操作 file1=open(src,'rb') file2=open(npath,'wb') s=file1.read() # 先读取file1，把s赋值为file1 file2.write(s) # 执行写入操作，把s写入file2 file2.close() file1.close() # 先打开的后关闭，后打开的先关闭 if __name__ == '__main__': src='./arc.png' # “./”一点一杠代表当前路径 npath='../chap/copy_arc.png' # “../”两点一杠代表上级目录，即等效于后退一步 copy(src,npath) print('文件复制完毕') 1.3 文件的状态和操作过程存储状态：文件在磁盘上未被打开的状态。占用状态：文件被open() 打开后进入占用状态，此时文件不允许其他程序进行操作，需要close() 将其关闭才能回到可操作状态。2 with语句2.1 定义又称上下文管理器（context manager），在处理文件时，无论是否产生异常，都能保证with语句执行完毕后关闭已经打开的文件，这个过程是自动的，无需手动操作。2.2 语法结构with open(...)as file: pass 2.3 例11.5：with语句def write_fun(): # 打开文件 aa.txt 以写入模式，并确保在操作完成后关闭文件 with open('aa.txt', 'w', encoding='utf-8') as file: # 写入内容到文件 file.write('2022北京冬奥会欢迎您') def read_fun(): # 打开文件 aa.txt 以读取模式，并确保在操作完成后关闭文件 with open('aa.txt', 'r', encoding='utf-8') as file: # 读取文件内容并打印 print(file.read()) def copy(src_file, target_file): # 打开源文件以读取模式，并确保在操作完成后关闭文件 with open(src_file, 'r', encoding='utf-8') as file: # 打开目标文件以写入模式，并确保在操作完成后关闭文件 with open(target_file, 'w', encoding='utf-8') as file2: # 读取源文件内容并写入目标文件 file2.write(file.read()) if __name__ == '__main__': # 调用写入函数 write_fun() # 调用读取函数 read_fun() # 调用复制函数 copy('./aa.txt', './dd.txt') 3 数据的组织维度及存储3.1 定义数据的组织维度，也称为数据的组织方式或存储方式，在Python中常用的数据组织方式可分为一维数据、二维数据和高维数据。一维数据：通常采用线性方式组织数据，一般使用Python中的列表、元组或者集合进行数据的存储。二维数据：也称表格数据，由行和列组成，类似于Excel表格，在Python中使用二维列表进行存储。高维数据：使用键值对（key-value pair）方式组织数据，并借助字典形式存储。在Python中内置的json模块专门用来处理JSON（JavaScript Object Notation）格式的数据。3.2 高维数据JSON模块的常用函数函数名称说明json.dumps(obj)将Python数据类型转成JSON格式过程，编码过程json.loads(s)将JSON格式字符串转成Python数据类型，解码过程json.dump(obj,file)与dumps()功能相同，将转换结果存储到file中json.load(file)与loads()功能相同，从file中读入数据3.3 例11.6：一维和二维数据的存储def my_write(): # 定义一个包含一维数据的列表 lst = ['adx', 'wmc', 2024, 39] # 打开文件 'mai.csv' 以写模式 ('w') 打开，如果文件不存在将创建文件 with open('mai.csv', 'w') as file1: # 使用 join() 方法将列表元素转换为字符串，并用逗号连接每个元素 file1.write(','.join(lst)) # join() 用于将列表元素转为字符串，用逗号拼接元素 def my_read(): # 打开文件 'mai.csv' 以读模式 ('r') 打开 with open('mai.csv', 'r') as file1: # 读取文件内容并存储到字符串变量 s 中 s = file1.read() # 使用 split() 方法将字符串转换为列表，分隔符为逗号 lst = s.split(',') # 打印列表 print(lst) # 存储和读取二维数据 def my_write_table(): # 定义一个包含二维数据的列表 lst = [ ['商品名', '单价', '采购数量'], ['adx controller', '10888', '1'], ['yuangeki', '1500', '2'] ] # 打开文件 'wmcshopping.csv' 以写模式 ('w') 打开，并指定编码为 'utf-8' with open('wmcshopping.csv', 'w', encoding='utf-8') as file2: # 遍历列表中的每个子列表 for item in lst: # 使用 join() 方法将子列表元素转换为字符串，并用逗号连接每个元素 line = ','.join(item) # 将转换后的字符串写入文件 file2.write(line) # 写入换行符，以分隔每一行数据 file2.write('\n') def my_read_table(): # 定义一个空列表，用于存储读取的数据 data = [] # 打开文件 'wmcshopping.csv' 以读模式 ('r') 打开，并指定编码为 'utf-8' with open('wmcshopping.csv', 'r', encoding='utf-8') as file2: # 使用 readlines() 方法读取文件的每一行，并返回一个列表，其中每个元素为文件的一行 lst = file2.readlines() # 遍历每一行数据 for item in lst: # 使用切片操作移除每行末尾的换行符，并使用 split() 方法将字符串转换为列表，分隔符为逗号 new_lst = item[:len(item)-1:].split(',') # 将转换后的列表添加到 data 列表中 data.append(new_lst) # 打印存储的二维数据 print(data) if __name__ == '__main__': # 调用 my_write() 函数 # my_write() # 调用 my_read() 函数 # my_read() # 调用 my_write_table() 函数 # my_write_table() # 调用 my_read_table() 函数 my_read_table() 3.4 例11.7：高维数据的存储import json # 准备高维数据 lst=[ {'name':'Leo','age':21,'score':3.89}, {'name':'Hazel','age':21,'score':3.93}, {'name':'Karen','age':21,'score':3.87} ] s=json.dumps(lst,ensure_ascii=False,indent=4) # ensure_ascii用以正常显示字符，indent为缩进，增强JSON字符串可读性 print(type(s)) # 编码：list-->str print(s) # 解码：str-->list lst2=json.loads(s) print(type(lst2)) print(lst2) # 编码到文件中 with open('student.txt','w') as file1: json.dump(lst,file1,ensure_ascii=False,indent=4) # 解码到程序 with open('student.txt','r') as file1: lst3=json.load(file1) print(type(lst3),lst3) 4 目录与文件的相关操作4.1 OS模块OS模块是Python内置的与操作系统文件相关的模块，该模块中语句的执行结果通常与操作系统相关，即运行环境的差异（如Windows和MacOS）可能导致结果存在差异。4.1.1 常用函数函数名称说明getcwd()获取当前工作路径listdir(path)获取path路径下的文件和目录信息 如无指定path，则获取当前路径下的文件和目录信息mkdir(path)在指定路径下创建目录（文件夹）makedirs(path)创建多级目录rmdir(path)删除path下的空目录removedirs(path)删除多级目录chdir(path)把path设置为当前目录walk(path)遍历目录树，结果为元组，包含所有路径名、所有目录列表和文件列表remove(path)删除path指定的文件rename(a,b)将a重命名为bstat(path)获取path指定的文件信息startfule(path)启动path指定的文件4.1.2 例11.8：OS模块的使用：创建目录/删除目录/改变工作路径/遍历目录树import os print('current path:',os.getcwd()) lst=os.listdir() print('all directories and files in current path:',lst) print('all directories and files in specific path:',os.listdir('D:/')) # 创建目录 os.mkdir('folder1') # 若当前路径下已存在同名目录，则报错（FileExistError: [WinError 183]） # 创建多级目录 os.makedirs('./f1/f2/f3') # 删除空目录 os.rmdir('folder1') # 同样效果：os.rmdir('./folder1') # 若重复执行或文件夹不存在，会报错FileNotFoundError: [WinError 2] os.removedirs('./f1/f2/f3') # 删除多级目录 # 改变当前路径 print('current path:',os.getcwd()) os.chdir('D:/') print('current path (changed):',os.getcwd()) # python文件路径没变，程序运行路径发生改变 # walk()遍历目录树：递归操作 for dirs,dirlst,filelst in os.walk('D:/'): print(dirs) print(dirlst) print(filelst) print('-'*20) 4.1.3 例11.9：OS模块的高级操作：删除文件/重命名文件/查看文件信息/启动文件import os # 删除文件 os.remove('./a.txt') # 若重复执行或文件不存在，会报错FileNotFoundError: [WinError 2] # 重命名文件 os.rename('./aa.txt','./new_aa.txt') # 若重复执行或文件不存在，会报错FileNotFoundError: [WinError 2] # 查看文件信息 import time # 转换时间信息 def date_form(longtime): s=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(longtime)) return s info=os.stat('./new_aa.txt') print(type(info),info) print('last time to visit this file:',date_form(info.st_atime)) print('last time to modify this file:',date_form(info.st_mtime)) print('creation time in Win system:',date_form(info.st_ctime)) print('storage of this file:',date_form(info.st_size),'B') # 启动路径下的文件 os.startfile('calc.exe') # 打开计算器（效果视同Win+R） os.startfile(r"C:\Users\23608\AppData\Local\Programs\Python\Python311\python.exe") # 前写r避免Python识别路径中的右斜杠为转义字符4.2 os.path模块os.path模块是OS模块的子模块，也提供了一些目录或文件的操作函数。4.2.1 常用函数函数名称说明abspath(path)获取目录或文件的绝对路径exists(path)判断目录或文件在磁盘上是否存在，结果为布尔类型 若存在结果为True，反之为Falsejoin(path,name)将目录与目录名或文件名进行拼接，相当于字符串的“+”操作splitext()分别获取文件名和后缀名basename(path)从path中提取文件名dirname(path)从path中提取路径（不包含文件名）isdir(path)判断path是否为有效路径isfile(path)判断file是否为有效文件4.2.2 例11.10：os.path模块的使用import os.path # 获取绝对路径 print('absolute path:', os.path.abspath('./b.txt')) # 解释：os.path.abspath() 返回指定路径的绝对路径。 # 判断文件是否存在 print('if "b.txt" exists:', os.path.exists('./b.txt')) print('if "new_b.txt" exists:', os.path.exists('./new_b.txt')) # 解释：os.path.exists() 检查指定路径是否存在。 # 判断目录是否存在 print('if "folder1" exists:', os.path.exists('./folder1')) # 解释：os.path.exists() 也可以用于检查目录是否存在。 # 拼接路径 print('complete path:', os.path.join('D:/', 'b.txt')) # 解释：os.path.join() 将多个路径组合成一个路径。 # 分割文件名和后缀名 print('split name and suffix:', os.path.splitext('b.txt')) # 解释：os.path.splitext() 将文件名和扩展名分开，返回一个元组。 # 提取文件名/路径 print('extract file name:', os.path.basename('D:/b.txt')) print('extract file directory:', os.path.dirname('D:/b.txt')) # 解释：os.path.basename() 提取路径中的文件名， # os.path.dirname() 提取路径中的目录名。 # 验证路径/文件有效性 print('validity of a directory:', os.path.isdir('D:/')) print('validity of a file:', os.path.isfile('D:/b.txt')) # 解释：os.path.isdir() 检查路径是否是一个目录， # os.path.isfile() 检查路径是否是一个文件。
【Python基础教程·第五辑】模块及常用的第三方模块
Python(5): 模块及常用的第三方模块1 模块（Module）1.1 模块的定义、功能和特点在Python中，一个后缀名为 $.py$的Python文件就是一个模块。模块中可以定义函数、类等，是特定功能代码的一种封装。模块也可以避免函数、类、变量等名称相冲突的问题。模块不仅提高了代码的可维护性，还提高了代码的可复用性。模块的命名规范如下：①全部使用小写字母；②多个单词之间使用下划线分隔。若自定义模块名称与系统内置模块名称相同，在导入时会优先导入自定义模块。1.2 模块的分类1.2.1 系统内置模块有开发人员编写好的模块，在安装Python解释器时一同安装至计算机。1.2.2 自定义模块一个以 $.py$结尾的文件就是一个自定义模块。1.2.2.1 作用规范代码，将功能相同的函数、类封装到一个模块中，提高代码可读性。可被其他模块调用，提高开发效率。1.2.2.2 例10.1：自定义模块my\_info# 假设本模块名为“my_info.py” # 自定义变量 name='njsukleo' # 自定义函数 def info(): print(f'Hello, everyone. I am {name}') 1.2.3 第三方模块由全球Python爱好者、程序员、各行各业的专家进行开发和维护。1.2.3.1 安装与卸载（以下指令适用于cmd/Powershell）安装：pip install module_name 卸载：pip uninstall module_name 升级pip：python -m pip install —upgrade pip 检测是否安装了某个第三方库：pip show module_name 1.3 模块的导入1.3.1 import导入语法结构：import module_name [as alias] 若模块名过长，允许在import后定义一个别名（alias）进行简便调用。注意，在取别名后，打点调用时必须使用别名。1.3.2 from...import导入语法结构：from module_name import variant/function/class/* 通过此方式可以导入模块中的变量、函数和类。$*$是通配符，表示导入全部内容。1.3.3 例10.2-10.4：模块的导入import my_info print(my_info.name) # 打印自定义模块的变量 my_info.info() # 执行自定义模块的函数 import my_info as a # 定义别名 print(a.name) a.info() from my_info import name print(name) # 此种方式不需要再打点调用 # info()使用不了，因为没有导入（NameError） from my_info import info info() from my_info import * # 导入全部内容 print(name) info() # 同时导入多个模块 import math,time,random # 调用时有同名变量或函数冲突：后者会覆盖前者 # 解决方法：使用import ...导入模块后单个打点调用变量或函数 # 假设有一个intro.py模块中与my_info.py有同名变量和函数 from my_info import * from intro import * info() # 此时会调用intro模块中的info函数 import my_info import intro my_info.info() intro.info() # 确保了两个函数不发生冲突2 包（Package）2.1 定义包（package）是含有 $\verb|__init__.py|$文件的文件夹（目录）。可以避免模块名称相冲突的问题。2.2 创建包在PyCharm中右击目录，选择$\verb|New >> Python Package|$，再进行命名即可。包创建完成后，自带一个空的 $\verb|__init__.py|$文件。2.3 包的导入2.3.1 import导入导入语法结构：import package_name.module_name [as alias] 2.3.2 from...import导入以“包名-模块名”导入的语法结构：from package_name import module_name [as alias] （打点调用）以“包名.模块名-函数名/变量名”导入的语法结构：from package_name.module_name import variant/function_name [as alias] （无需打点调用） 2.3.3 init执行问题不论使用哪种方法导入包，其中的$\verb|__init__.py|$文件都会自动导入并执行。这种执行只会在包初次被导入时发生且仅发生一次。2.4 主程序运行（重要）if __name__ == '__main__' : pass 2.4.1 例10.5：使用主程序运行阻止全局变量的输出执行假设有以下模块$\verb|module_a.py|$：# module_a.py print('welcome to Beijing') name='njsukleo' print(name) 同目录下，有$\verb|module_b.py|$代码如下：# module_b.py import module_a此时执行$\verb|module_b.py|$，上一模块中的指令会被执行。若我们不想在导入模块的同时执行它们而只是导入，我们可以使用主程序运行避免其执行。我们修改$\verb|module_a.py|$内容如下：# module_a.py if __name__ == '__main__' : print('welcome to Beijing') name='njsukleo' print(name) 此时再执行$\verb|module_b.py|$，导入模块的两句代码不再被执行。3 常用系统内置模块/Python标准库在安装Python解释器时一并安装进来的模块（大约270个）称为系统内置模块，也被称为标准模块或标准库。标准库位置：$\verb|.../Python/Python3.11/Lib|$标准库名称说明os与操作系统和文件相关操作有关re在字符串中执行正则表达式random产生随机数json对高维数据进行编码和解码time与时间相关datetime与日期时间相关，可以方便地显示和运算日期3.1 random模块random模块是Python中用于产生随机数的标准库。函数名称说明seed(x)初始化给定的随机数种子，默认为当前系统时间戳random()产生一个[0.0,1.0)之间的随机浮点数randint(a,b)产生一个[a,b]之间的随机整数randrange(m,n,k)产生一个[m,n)之间步长为k的随机整数uniform(a,b)产生一个[a,b]之间的随机浮点数choice(seq)从序列seq中随机选择一个元素shuffle(seq)打乱序列seq并返回打乱后的新序列3.1.1 例10.11：random模块的使用import random # 设置种子 random.seed(10) print(random.random()) print(random.random()) # [0,1), float # 因为随机种子固定，重复运行此两行，所得随机数相同 # 按住Ctrl点选random，可从标准库文档中查看所调用的函数 print('-'*20) random.seed(10) print(random.randint(1,100)) # [1,100], integer for i in range(10): # 取10次随机数 print(random.randrange(1,10,3)) # [1,10), integer, step=3 print(random.uniform(1,100)) # [1,100], float lst=[for i in range(1,11)] print(random.choice(lst)) # 随机从lst取一个元素 random.shuffle(lst) print(lst) random.shuffle(lst) print(lst) # 两次结果不一样 3.2 time模块3.2.1 函数函数名称说明time()获取当前时间戳localtime(sec)获取指定时间戳对应的本地时间的$\verbstruct_time$对象 ctime()获取当前时间戳对应的易读字符串strftime()格式化时间，结果为字符串 str→string; ft→formatstrptime()提取字符串的时间，结果为$\verbstruct_time$对象 sleep(sec)休眠$\verbsec$秒3.2.2 格式化字符串（formatted string）格式化字符串说明取值范围$\verb%Y$年份0001-9999$\verb%m$月份01-12$\verb%B$月名January-December$\verb%d$日期01-31$\verb%A$星期Monday-Sunday$\verb%H$小时（24h制）00-23$\verb%I$小时（12h制）01-12$\verb%M$分钟00-59$\verb%S$秒00-593.2.3 例10.12：time模块的使用import time now=time.time() print(now) # 输出时间戳 obj=time.localtime() print(obj) # 输出struct_time对象 obj2=time.localtime(60) print(type(obj2),obj2) # 时间戳为60时，输出为1970/1/1 GMT+8 8:01 print('Year:',obj2.tm_year) print('Month:',obj2.tm_mon) print('Date:',obj2.tm_mday) print('Hour:',obj2.tm_hour) print('Min:',obj2.tm_min) print('Second:',obj2.tm_sec) print('Weekday:',obj2.tm_wday) # 取值[0,6]，因此2表示星期三 print('Day of the year:',obj2.tm_yday) # 今年第几天 print(time.ctime()) # ctime-->易读字符串 # 日期时间格式化 print(time.strftime('%Y-%m-%d',time.localtime())) print(time.strftime('%H:%M:%S',time.localtime())) print(time.strftime('%B',time.localtime())) # 月份名称 print(time.strftime('%A',time.localtime())) # 星期名称 # 字符串转回struct_time对象 print(time.strptime('2008-08-08','%Y-%m-%d') # 程序暂停秒数 time.sleep(20) print('helloworld')3.3 datetime模块类名说明datetime.datetime表示日期时间的类datetime.timedelta表示时间间隔的类 注意：年、月不可计算datetime.date表示日期的类datetime.time表示时间的类datetime.tzinfo时区相关的类datetime子类的函数说明datetime(y,m,d,h,m,s)通过传入参数创建包含从年到秒的datetime对象datetime.now()获取当前时间timedelta子类的函数说明timedelta(d,sec)通过传入参数创建timedelta对象3.3.1 例10.13：datetime类的使用from datetime import datetime dt=datetime.now() # 获取当前系统时间 print(dt) # 手动创建对象 dt2=datetime(2077,1,14,16,35) print(type(dt2),dt2) # 类型为class print(dt2.year,dt2.month,dt2.day) # 年月日时分秒都可以取出 # 比大小 d1=datetime(2028,5,1,0,0,0) d2=datetime(2028,10,1,0,0,0) print('2028/5/1 earlier than 2028/10/1?',d1<d2) # datetime class -> str nwt=datetime.now() print(type(nwt)) # 验证nwt为class nwt_str=nwt.strftime('%Y/%m/%d %H:%M:%S') print(type(nwt_str)) # 验证nwt_str为str # datetime str -> class str_time='2077/7/7 07:07:07' d3=datetime.strptime(str_time,'%Y/%m/%d %H:%M:%S') print(type(str_time),str_time) # 验证 print(type(d3),d3) # 验证d3为class和d3的数据3.3.2 例10.14：timedelta类的使用from datetime import datetime from datetime import timedelta # 进行datetime类型之间的算术运算 delta1=datetime(2028,10,1)-datetime(2028,5,1) print(type(delta1),delta1) # 153 days, 0:00:00 print('validation',datetime(2028,5,1)+delta1) # 通过传入参数创建timedelta对象 dt1=timedelta(10) print('a 10-day timedelta obj:',dt1) # 创建10天的timedelta对象 4 常用第三方库4.1 requests模块（处理HTTP请求/爬虫）4.1.1 简介用于处理超文本传输协议（HTTP）请求的第三方库，该库在爬虫（web crawlers）中应用广泛。使用requests库中的get()函数可以打开一个网络请求，并获取一个$\verb|Response|$响应对象。响应结果中有字符串数据也有二进制数据（如图片、音频、视频等），前者可以通过响应对象的$\verb|text|$属性获取，后者可以通过响应对象的$\verb|content|$属性获取。4.1.2 函数函数说明get()打开一个网络请求，并获取一个$\verbResponse$响应对象4.1.3 例10.15：爬取“中国天气网”中“景点推荐”模块的天气数据import requests import re # 正则表达式模块 url1='http://www.weather.com.cn/weather1d/101120101.shtml' resp_obj=requests.get(url1) # 获取一个响应对象，定义为resp_obj resp_obj.encoding='utf-8' # 设置编码格式 print(resp_obj.text) # 对象名.属性名，可获取html语言格式的网页内容 # 进一步使用正则表达式提取对象 city=re.findall('([\u4e00-\u9fa5]*)',resp_obj.text) weather=re.findall('([\u4e00-\u9fa5]*)',resp_obj.text) temperature=re.findall('(.*)',resp_obj.text) situation=re.findall('([\u4e00-\u9fa5]*)',resp_obj.text) print('二维列表') print(city) print(weather) print(temperature) print(situation) lst=[] # 使用列表打包数据 for a,b,c,d in zip(city,weather,temperature,situation): lst.append([a,b,c,d]) print('一维数据') print(lst)4.1.4 例10.16：爬取百度的Logo图片import requests url='https://www.baidu.com/img/PCfb_5bf082d29588c07f842ccde3f97243ea.png' r=requests.get(url) # 保存到本地 with open('logo.png','wb')as file1: # 二进制文件，使用with()覆写 file1.write(r.content) 4.2 openpyxl模块（写入/读取Excel数据，自动化办公）4.2.1 简介用于处理Microsoft Excel文件的第三方库。可以对Excel文件中的数据进行写入和读取。4.2.2 函数函数说明load\_workbook(filename)打开已存在的表格，结果为工作簿对象workbook.sheetnames工作簿对象的sheetnames属性，用于获取所有工作表的名称，结果为列表类型sheet.append(lst)向工作表中（末尾）添加一行数据workbook.save(excelname)保存工作簿Workbook()创建新的工作簿对象4.2.3 例10.18：把上例天气数据存储至Excel中# weather.py # 封装 import requests import re # 正则表达式模块 def get_html(): url1='http://www.weather.com.cn/weather1d/101120101.shtml' resp_obj=requests.get(url1) # 获取一个响应对象，定义为resp_obj resp_obj.encoding='utf-8' # 设置编码格式 return resp_obj.text def parse_html(h_str): # 进一步使用正则表达式提取对象 city=re.findall('([\u4e00-\u9fa5]*)',h_str) weather=re.findall('([\u4e00-\u9fa5]*)',h_str) temperature=re.findall('(.*)',h_str) situation=re.findall('([\u4e00-\u9fa5]*)',h_str) lst=[] # 使用列表打包数据 for a,b,c,d in zip(city,weather,temperature,situation): lst.append([a,b,c,d]) return lst import weather import openpyxl html=weather.get_html() # 发请求，得响应结果 lst=weather.parse_html(html) # 解析数据 # 创建新工作簿 workbook=openpyxl.Workbook() # 创建工作表 sheet=workbook.create_sheet('景区天气') # 添加数据 for item in lst: sheet.append(item) # 循环一次添加一行 workbook.save('景区天气.xlsx')4.2.4 例10.19：从Excel中读取数据import openpyxl # 打开工作簿 wb=openpyxl.load_workbook('景区天气.xlsx') # 选择要操作的工作表 sheet=wb['景区天气'] # 先遍历行，后遍历列 lst=[] # 存储行数据 for row in sheet.rows: sublst=[] # 存储单元格数据 for cell in row: sublst.append(cell.value) lst.append(sublst) for item in lst: print(item) 4.3 pdfplumber模块（读取PDF内容，自动化办公）4.3.1 简介pdfplumber模块可用于从PDF文件中读取内容。4.3.2 例10.20：从pdf提取数据import pdfplumber with pdfplumber.open('1.pdf') as file1: for i in file1.pages: print(i.extract_text()) # extract_text()方法提取内容 print(f'-------------第{i.page_number}页提取完成') 4.4 Numpy模块4.4.1 简介Numpy是Python数据分析方向和其他库的依赖库，用于处理数组、矩阵等数据。Numpy也可以用来处理图片。4.4.2 例10.21：图像的灰度处理import numpy as np import matplotlib as plt # 读取图片 n1=plt.imread('google_logo.png') # 输出为三维数组，最高维度表示图片的高度，次高维度表示宽度，最低维度是RGB plt.imshow(n1) # 编写一个灰度公式 n2=np.array([0.299,0.587,0.114]) # 创建数组 # n1（RGB）与n2（灰度）点乘运算 x=np.dot(n1,n2) # 传入数组，显示灰度 plt.imshow(x,cmap='gray') # 显示图像 plt.show()4.5 Pandas模块和Matplotlib模块4.5.1 简介Pandas是基于Numpy模块扩展的一个非常重要的数据分析模块，使用Pandas读取Excel数据更加方便。Matplotlib是用于数据可视化的模块，使用$\verb|Matplotlib.pyplot|$可以便捷绘制饼图、柱形图、折线图等。4.5.2 例10.22：绘制饼图import pandas as pd import matplotlib.pyplot as plt # 读取Excel文件 df = pd.read_excel('JD销售数据.xlsx') # 解决中文乱码 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 # 设置画布大小 plt.figure(figsize=(10, 6)) # 提取数据 labels = df['商品名称'] y = df['北京出库销量'] # 绘制饼图 plt.pie(y, labels=labels, autopct='%1.1f%%', startangle=90) # 设置x/y轴刻度 plt.axis('equal') # 设置标题 plt.title('JD销量（北京）各品牌占比') # 显示图表 plt.show() 4.6 PIL/pillow模块（模糊图像）4.6.1 简介用于图像处理的第三方库，它支持图像存储、处理和显示等操作。# 安装时，模块名字为“pillow” pip install pillow# 调用时，模块名字为“PIL” from PIL import Image4.7 jieba模块（中文分词）4.7.1 简介用于对中文进行分词。4.8 PyInstaller模块（打包源文件）
Python(4)：组合数据类型-序列/列表/元组/字典/集合序列和索引序列（Sequence）序列，是一个用于存储多个值的连续空间。属于列表结构的还有列表、元组、字典和集合。其中，列表和元组称为有序序列，字典和集合称为无序序列。此四类又合称为Python中的组合数据类型。索引（Index）序列中的每一个值都对应一个整数的编号，称为索引。索引有两种类型：正向递增索引和反向递减索引。如下图：n个元素组成序列的正向递增索引的范围是从0（对应第一个元素）到n-1（对应第n个元素）；n个元素组成序列的反向递减索引的范围是从-n（对应第一个元素）到-1（对应第n个元素）。例5.1：使用索引检索字符串中的元素说明正向递增假设字符串 s 是 'helloworld'，len(s) 是 10。range(len(s)) 生成从 0 到 9 的整数序列。第一次循环：i 是 0s[i] 是 s[0]，即 'h'print(i, s[i], end='\t\t') 打印 0 h，然后添加两个制表符 \t\t第二次循环：i 是 1s[i] 是 s[1]，即 'e'print(i, s[i], end='\t\t') 打印 1 e，然后添加两个制表符 \t\t依次类推，直到 i 为 9。反向递减：同理如上。# 正向递增 s='helloworld' for i in range(0, len(s)): print(i,s[i],end='\t\t') print('\n---------------') # 反向递减 for i in range(-10,0): print(i,s[i],end='\t\t') # 正反一致性 print('\n',s[9],s[-1]) # 其获取的字符是一致的序列的操作序列的切片（Slicing）参见：索引和切片切片是访问序列中一定范围内元素的一种方法，不仅可以应用于字符串，还有其他类型。切片操作的语法结构：[start:end:step] start: 切片的开始索引（包含）end: 切片的结束索引（不包含）step: 步长（默认为1）1例：序列 [0:5:2]例5.2：序列的切片操作s='Helloworld' # 切片操作 s1=s[0:5:2] # 索引从0开始，到5结束（不含5），步长为2，结果为：Hlo print(s1) # 省略开始位置，start默认从0开始 print(s[:5:1]) # 结果为：Hello，等同于print(s[0:5:1]) # 省略开始位置和步长，start默认从0开始，step默认为1 print(s[:5:]) # 结果为：Hello，等同于print(s[0:5:1]) # 省略结束位置，stop默认到序列的最后一个元素（包含最后一个） print(s[0::1]) # 结果为：Helloworld，等同于print(s[0:11:1]) # 省略结尾位置和步长 print(s[5::]) # 结果为：world print(s[5:]) # 同上 # 省略开始位置和结束位置，只写步长 print(s[::2]) # 会获取索引为0/2/4/6/8的元素，结果为：Hlool # 步长为负数 print(s[::-1]) # 逆向输出，结果为：dlrowolleH print(s[-1:-11:]) # 使用反向递减索引，结果同上序列的函数和操作符操作符/函数描述说明x in s若x是s的元素→True；反之Falsex not in s若x非s的元素→True；反之Falselen(s)序列s元素的个数（即：序列的长度）max(s)序列s元素的最大值min(s)序列s元素的最小值s.index(x)检索x首次出现在序列s中的位置s.count(x)检索x出现在序列s中的次数例5.3：序列相加和相乘s='Hello' s2='World' print(s+s2) # 产生一个新的字符串序列 # 序列的相乘操作 print(s*5) # 重复五次，代替循环 例5.4：序列的相关操作符和函数的使用s='helloworld' # x in s 的使用 print('e在s中存在吗？',('e' in s)) print('v在s中存在吗？',('v' in s)) # x not in s 的使用 print('e在s中不存在吗？',('e' not in s)) print('v在s中不存在吗？',('v' not in s)) # 内置函数 print('len():',len(s)) print('max():',max(s)) print('min():',min(s)) # 序列对象的方法（使用序列的名称，打点调用） print('s.index():',s.index('o')) # 输出o首次出现的索引值 print('s.index():',s.index('v')) # v不存在，会报错ValueError print('s.count():',s.count('o'))组合数据类型1：列表（List）定义列表是指一系列的、按照特定顺序排列的元素组成，与int/float/str这类不可变字符序列都不尽相同。是Python中内置的可变序列。在Python中使用[]定义列表，元素与元素之间使用英文的逗号分隔。列表中的元素可以是任意的数据类型。创建与删除列表使用[]直接创建列表语法结构：name=[element1,element2,......,elementN]使用内置函数list()创建列表语法结构：name=list(序列) 删除语法结构：del name例5.5：列表的创建与删除# 直接使用[]创建列表 l=['hello','world',98,3.14,'100'] # 列表中可包含不同数据类型 print(l) # 使用内置函数list() l2=list('helloworld') l3=list(range(1,10,2)) # 从1开始到10结束，不包含10，步长2 print(l2) print(l3) # 列表是序列的一种，对序列的操作符、运算符、函数均适用 print(l+l2+l3) # 列表相加 print(l*3) # 列表相乘 print(len(l)) print(max(l)) print(min(l)) print(l2.count('o')) print(l2.index('o')) # 列表的删除 l4=[10,20,30] print(l4) del l4 print(l4) # 删除后出现NameError错误，证明删除有效遍历列表：enumerate函数语法结构enumerate 函数在 Python 中是一个非常有用的工具，它允许你在遍历一个可迭代对象（如列表、元组或字符串）时，同时获取元素的索引和值。这在很多情况下都非常有用，因为它可以让你的代码更简洁和易读。语法结构：enumerate(iterable, start=0)例5.6：三种列表的遍历操作# 直接使用for循环 l1=['Hello','world','python','php'] for i in l1: print(i,end='\t\t') print(end='\n') # 输出结果为Hello world python php # 使用for+range+len for i in range(0,len(l1)): print(i,'--->',l1[i],end='\t\t') print(end='\n') # 输出结果为0 ---> Hello 1 ---> world 2 ---> python 3 ---> php # 使用enumerate for a,b in enumerate(l1): print(a,b,end='\t\t') # 输出结果为0 Hello 1 world 2 python 3 php # 使用enumerate时可以手动修改序号的起始值 for a,b in enumerate(l1,start=1): # 代表从列表l1的第二个元素开始 print(a,b) for a,b in enumerate(l1,1): # start可以省略不写，等效如上 print(a,b) 列表的方法方法描述说明s.append(x)在列表s最后增加一个元素xs.insert(n,x)在列表序列n处增加一个元素xs.clear()清除列表s中的所有元素s.pop(n)将列表s中序列n处位置元素取出，并从列表中删除s.remove(x)将列表s中出现的第一个元素x删除s.reverse(x)将列表s中的元素x反转 注意，print(s.reverse()) 无返回值，只会返回Nones.copy()拷贝列表s中的所有元素，生成一个新列表s[x]=修改列表s中序列为x的元素例5.7：列表的相关操作lst=['hello','world','python'] print('原列表：',lst,id(lst)) # 增加元素 lst.append('spl') print('增加元素之后：',lst,id(lst)) # 之所以列表被称为可变数据类型，就是因为其元素可变的同时，内存地址保持不变 # 插入元素 lst.insert(_index:1,_object:100) print(lst) # 在索引1（第二个位置）位置插入100，其他元素后撤1 # 删除元素 lst.remove('world') print(lst,id(lst)) # 使用了删除后，内存位置依然不会变 # 先取出再删除 print(lst.pop(1)) # 会先将100取出，再删除 print(lst) # 清空元素 lst.clear() print(lst,id(lst) # 逆向输出 lst2=['hello','world','python'] lst2.reverse() # 不会产生新列表，在原列表的基础上进行 print(lst2) # 列表拷贝，将产生一个新列表 lst3=lst2.copy() print(lst2,id(lst2)) # 内存位置依然不会变 print(lst3,id(ist3)) # 列表元素修改 lst2[1]='mysql' print(lst2)列表的排序sort方法语法结构：s.sort(key=None,reverse=False)key表示排序的规则，reverse表示排序方式，默认升序。内置函数sorted()语法结构：sorted(iterable,key=None,reverse=False)iterable表示可迭代的排序对象，其他同上。例5.8：列表的排序操作（sort方法）lst=[4,56,3,78,40,56,89] print('原列表：',lst) # sort方法升序：整数 lst.sort() # 排序是在原列表的基础上进行的，不会产生新的列表对象 print('升序：',lst) # sort方法降序：整数 lst.sort(reverse:True) print('降序：',lst) print('-'*20) lst2=['banana','apple','Cat','Orange'] print('原列表：',lst2) # sort方法升序：英文字母 lst2.sort() # 先排大写，再排小写。因为按照ASCII码值，大写+32=小写 print('升序：',lst2) # sort方法降序：英文字母 lst2.sort(reverse:True) print('降序：',lst2) # 自制定规则：忽略大小写 lst2.sort(key=str.lower) # 参数，不加括号（只有调用加括号） print(lst2)例5.9：列表的排序操作（sorted函数）lst=[4,56,3,78,40,56,89] print('原列表：',lst) # sorted升序：整数 asc_lst=sorted(lst) # 使用sorted排序需要先定义一个新的列表对象 print('升序：',asc_lst) print('原列表：',lst) # sorted降序：整数 desc_lst=sorted(lst,reverse=True) print('降序：',desc_lst) print('原列表：',lst) print('-'*20) lst2=['banana','apple','Cat','Orange'] print('原列表：',lst2) # sorted忽略大小写排序 lst3=sorted(lst2,key=str.lower) # 参数，不加括号（只有调用加括号） print('原列表：',lst2) print('sorted列表：',lst3) 列表生成式（List Comprehension）语法结构s=[expression for item in range]s=[expression for item in range if condition]例5.10：列表生成式的使用import random lst=[x for x in range(1,11)] print(lst) # 将生成1-10的整数 lst=[x*x for x in range(1,11)] print(lst) # 将生成1-10每个数的平方数 lst=[random.randint(1,100) for _ in range(10)] print(lst) # 将产生10个1-99之间的随机数 # 从列表中选择符合条件的元素组成新的列表 lst=[for i in range(10) if 1%2==0] print(lst) # 筛选偶数例5.11：二维列表的遍历与列表生成式# 创建二维列表 lst=[ ['城市','环比','同比','定基'] ['北京',103.4,129.8,122.4] ['上海',103.5,126.7,123.5] ['广州',100.3,140.3,104.5] ] print(lst) # 遍历二维列表，使用双层for循环 for row in lst: # 行 for item in row: # 列 print(item,end='\t') print() # 换行 # 列表生成式：生成一个4行5列的二维列表 lst2=[ [j for j in range(5)]for i in range(4)] print(lst2)组合数据类型2：元组（Tuple）定义是Python中内置的不可变序列。在Python中使用()定义列表，元素与元素之间使用英文的逗号分隔。元组中只有一个元素时，逗号也不能省略。创建与删除元组元组的创建使用()直接创建语法结构：name=(element1,element2,...,elementN)使用内置函数tuple()创建元组语法结构：name=tuple(index)元组的删除语法结构：del name例5.12：元组的创建与删除/元组作为序列的基本属性# 使用小括号直接创建 t=('hello',[10,20,30],'python','world') print(t) # 使用内置函数tuple()创建 t=tuple('helloworld') print(t) # 会自动把字符串的每一个字母拆分成单个元素输出 t=tuple([10,20,30,40]) print(t) # 会自动把列表中的每一个整数拆分成单个元素输出 # 序列操作：判断 print('10在元组中是否存在',(10 in t)) print('10在元组中不存在',(10 not in t)) # 序列操作：最值 print('maximum',max(t)) print('minimum',min(t)) # 序列操作：长度 print('length',len(t)) # 序列操作：查找和计数 print('index',t.index(10)) print('count',t.count(10)) # 单元素元组逗号不可省略 x=(10) print(type(x)) # 整数类型，而非元组 y=(10,) # 单元数元组的逗号不可省略 print(type(y)) # 删除元组 del y # print(y)就会报错遍历/访问元组例5.13：切片/访问，通过三种方式遍历元组t=('python','hello','world') # 根据索引访问元组 print(t[0]) # 切片 t2=[0:3:2] print(t2) # for遍历 for i in t: print(i) # for+range()+len()遍历 for j in range(len(t)): print(i,t[i]) # enumerate遍历 for k,l in enumerate(t,start=1): # 序号从1开始，不是序列从1开始 print(k,'-->',l) 元组生成式（Tuple comprehension）例5.14：元组生成式/__next__()方法取出元组元素t=(for i in range(1,4)) print(t) # 输出生成器对象（迭代器）本身，而不是其中的元素 t=tuple(t) print(t) # 输出为了元组元素 # __next__方法 # __next__方法无法只能遍历迭代器/生成器，不能遍历元组本身 u=(for j in range(1,4)) print(u.__next__()) # 取第一个（序列0）元素 print(u.__next__()) # 取第二个（序列1）元素 print(u.__next__()) # 取第三个（序列2）元素 print(u.__next__()) # 取第四个（序列3）元素 u=tuple(u) # 现在元组已经空掉了元组和列表的区别元组 Tuple列表 List不可变序列可变序列不能添加、删除和修改元素等操作可通过append(), insert(), remove(), pop()等方法添加、删除列表元素支持索引访问、切片，不支持修改支持索引访问、切片、修改元素访问和处理速度快访问和处理速度慢可作为字典的键不可作为字典的键组合数据类型3：字典（Dictionary）定义字典类型是根据一个信息查找另一个信息的方式构成了“键值对（key-value pair）”，它表示索引用的键（key）和对应的值（value）构成的成对关系。与列表类似，字典也是Python中的可变数据类型。与列表不一样的是，字典中的元素是无序的，这基于其排列元素时底层使用的哈希函数。但字典中可以通过键来查找元素。键在字典中是唯一的，不允许重复；但值可以出现重复。字典中的键要求是不可变序列：整数、浮点、字符串和元组均可，但列表不可。创建与删除字典字典的创建使用{}直接创建语法结构：name={key1:value1,key2:value2...}使用内置函数dict()创建字典语法结构：name=dict(key1=value1,key2=value2...)使用映射函数zip()创建字典语法结构：zip(lst1,lst2) 前置序列（列表或元组均可）对应key，后置序列对应value。zip()函数会自动对应相同索引的元素为一对。字典的删除语法结构：del name例5.15：字典的创建与删除# 使用{}创建 d={10:'cat',20:'dog',30:'pet',20:'zoo'} print(d) # 出现两个相同key时，不会报错，后者value会覆盖前者value，保证key唯一 # zip()创建对象的性质：哈希值-->以元组形式为元素的列表 lst1=[100,200,300,400] lst2=['a','s','d','f','g'] zipa=zip(lst1,lst2) print(zipa) # 输出一个hash值（zip object at hash_value），代表一个zip对象 print(list(zipa)) # 使用list()创建zipa为列表对象，发现列表中的元素为元组类型 # 第五个value不对应任何key，因此被略过 # 此时dict已经被转为了list # 使用zip()创建字典 lst3=[100,200,300,400] lst4=['a','s','d','f','g'] zipb=zip(lst3,lst4) d2=dict(zipb) print(d2) # 使用参数创建字典 d=dict(cat=10,dog=20) # cat is key, 10 is value print(d) # 元组可以作为键，因为元组不可变 t=(10,20,30) print({t:10}) # t is key, 10 is value # 列表不能作为键，因为列表可变 # lst=[10,20,30] # print({lst:10}) # TypeError: unhashable type: 'list' # 字典的序列性质：最值、长度（元素个数） print('maximum:',max(d)) print('minimum:',min(d)) print('length(number of elements):',len(d)) # 字典的删除 del d # print(d) # NameError: name 'd' is not defined.字典元素的取值和遍历取值字典没有整数索引，反之，其使用键来实现取值。语法结构：①d[key] ；或②d.get(key) 区别：若键不存在，①会报错，②会指定默认值。遍历遍历出key与value的元组for element in d.items(): pass 分别遍历出key和valuefor key.value in d.items(): pass 例5.16：字典元素的访问和遍历# 创建字典 d={'hello':10,'world':20,'python':30} # 访问元素：d(key) print(d['hello']) # 输出为10 # 访问元素：d.get(key) print(d.get('hello') # 输出为10 # 两种访问的区别 # print(d['java']) # KeyError: 'java' print(d.get('java')) # 不会报错，默认输出None print(d.get('java','不存在')) # 会输出指定值“不存在”代替None # 字典遍历 for i in d.items(): print(i) # 得到key=value的元组类型 for key,value in d.items(): print(key,'---->',value) 字典的方法方法描述说明d.keys()获取所有key数据d.values()获取所有value数据d.pop(key,default)key存在，获取相应value，同时删除该键值对； key不存在，获取默认值d.popitem()随机取出一对键值对，结果为元组类型，同时从字典中删除该键值对 注：Python 3.7版本后，该指令效果为“删除并返回‘最后插入’的键值对”d.clear清空字典中的所有键值对例5.17：字典的相关操作d={1001:'abc',1002:'def',1003:'ghi'} print(d) # 添加元素 d[1004]='jkl' print(d) # 获取keys keys=d.keys() print(keys) print(list(keys)) print(tuple(keys)) # 获取values values=d.values() print(list(values)) print(tuple(values)) # 转为键值对元组列表 lst=list(d.items()) print(lst) # 转回字典 d=dict(lst) print(d) # 使用pop删除键值对 print(d.pop(1001)) print(d) print(d.pop(1008,'not exist')) # 使用popitem删除末尾键值对 print(d.popitem()) print(d) # 清空字典元素 d.clear() print(d) # Python中一切皆对象，每个对象都有一个布尔值 print(bool(d)) # 空字典布尔值为False # 空列表、空元组的布尔值亦为False字典生成式（Dictionaty comprehension）① d={key:value for item in range}② d={key:value for key,value in zip(lst1,lst2)}例5.18：字典生成式import random d={for item:random.randint(1,100) in range(4)} print(d) lst=[1001,1002,1003] lst2=['a1','b2','c3'] d-{key:value for key,value in zip(lst,lst2)} print(d)组合数据类型4：集合（Set）定义Python中的集合与数学中集合的概念一致。它是一个无序的、不重复的元素序列。集合中只能存储不可变数据类型。集合使用{}定义。集合自身属于可变类型。创建与删除集合集合的创建使用{}直接创建语法结构：name={element1,element2,...}使用内置函数set()创建字典语法结构：name=set(iterable)集合的删除语法结构：del name例5.19：集合的创建与删除# 使用{}创建 s={10,20,3.14} # s={[10,20],[3.14]} TypeError: unhashable type: 'list' print(s) s={} print(s,type(s)) # 一对空花括号会创建一个空字典，而非空集 # 使用set()创建集合 s=set() # 创建了一个空集 print(s) print(bool(d)) # 空集的布尔值为False s=set('helloworld') print(s) # 输出结果会随机打乱元素排序，且只保留重复元素中的一个 s2=set([10,20,3.14]) # set()函数支持使用列表的不可变元素创建集合 s3=set(range(1,10)) print(s2) print(s3) # 集合的序列性质：最值、长度（元素个数）、判断存在 print('maximum:',max(s3)) print('minimum:',min(s3)) print('length(number of elements):',len(s3)) print('9 exist in set or not:',(9 in s3)) print('9 not exist in set:',(9 not in s3)) # 集合的删除 del s3 # print(s3) # NameError: name 's3' is not defined.集合操作符交集：A&B → A∩B并集：A|B → A∪B补集：A^B → $(A \cap B)^\complement \cap (A \cup B)$差集：A-B → $A-A(A \cap B)$例5.20：集合操作符A={10,20,30,40,50} B={30,50,76,88,20} # 交集 print(A&B) # 并集 print(A|B) # 差集：A减去相交部分 print(A-B) # 补集：AB并集减去相交部分 print(A^B)集合的操作方法、遍历和生成式方法描述说明s.add(x)若x不在s中，则添加x到集合ss.remove(x)若x在s中，将其删除；若不在，程序报错s.clear()清空集合中的所有元素例5.21：集合的操作方法/遍历/生成式s={10,20,30} # 添加元素 s.add(100) print(s) # 删除元素 s.remove(20) print(s) # 清空元素 s.clear() print(s) # 遍历：for s={10,30,100} for i in s: print(i) # 遍历：enumerate for index,i in enumerate(s): print(index,'-->',i) # 集合生成式 s={i for i in range(1,10)} print(s) s={for i in range(1,10) if i%2==1} print(s)Python 3.11新特性结构模式匹配语法结构match data: case {}: pass case []: pass case (): pass case _: pass 例5.22：结构的模式匹配data=eval(input('Type in your data to match:')) match data: case {'name':'njsukleo','pw':123456}: print('dict') case (10,20,30): print('tuple') case ([10,20,30]): print('list') case _: print('NOT MATCHED') #equal to the else in multiple if 字典合并运算符例5.23：合并字典的运算符|d1={'a':10,'b':20} d2={'c':30,'d':40,'e':50} merged_dict=d1|d2 print(merged_dict) # 输出合并后的字典，结果应该是 {'a': 10, 'b': 20, 'c': 30, 'd': 40, 'e': 50}。同步迭代语法结构match data1,data2: case data1,data2: pass 例5.24：同步迭代fruits=['apple','orange','pomegranate','avocado'] counts=[10,3,4,5] for f,c in zip(fruits,counts): match f,c: case 'apple',10: print('10 apples') case 'orange',3: print('3 oranges') case 'pomegranate',4: print('4 pomegranates') case 'avocado',5: print('5 avocados') 即：每隔“步长-1”字符访问一次 ↩