diff --git a/.obsidian/plugins/obsidian-dynamic-background/main.js b/.obsidian/plugins/obsidian-dynamic-background/main.js new file mode 100644 index 0000000..ef5edac --- /dev/null +++ b/.obsidian/plugins/obsidian-dynamic-background/main.js @@ -0,0 +1,701 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __async = (__this, __arguments, generator) => { + return new Promise((resolve, reject) => { + var fulfilled = (value) => { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + }; + var rejected = (value) => { + try { + step(generator.throw(value)); + } catch (e) { + reject(e); + } + }; + var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); + step((generator = generator.apply(__this, __arguments)).next()); + }); +}; + +// main.ts +var main_exports = {}; +__export(main_exports, { + default: () => DynamicBackgroundPlugin +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian = require("obsidian"); + +// effects/dark-dynamic-star-sky.ts +function Add_StarSky(dynamicBackgroundContainer) { + if (dynamicBackgroundContainer) { + let effect = dynamicBackgroundContainer.createEl("div", { cls: "odb-dt-star-sky-dynamic-effect" }); + effect.createEl("div", { cls: "star-sky" }); + } +} +function Remove_StarSky(dynamicBackgroundContainer) { + let effect = dynamicBackgroundContainer.find("div.odb-dt-star-sky-dynamic-effect"); + if (effect) { + effect.remove(); + } +} + +// effects/dark-dynamic-snow.ts +var DarkTheme_Snow_Background_Property = "radial-gradient(ellipse at bottom, #1b2735 20%, #090a0f 100%)"; +function Add_Snow(dynamicBackgroundContainer) { + if (dynamicBackgroundContainer) { + let effect = dynamicBackgroundContainer.createEl("div", { cls: "odb-dt-snow-dynamic-effect" }); + effect.createEl("div", { cls: "snow" }); + } +} +function Remove_Snow(dynamicBackgroundContainer) { + let effect = dynamicBackgroundContainer.find("div.odb-dt-snow-dynamic-effect"); + if (effect) { + effect.remove(); + } +} + +// effects/dark-dynamic-rain.ts +var DarkTheme_Rain_Background_Property = "radial-gradient(ellipse at bottom, #1b2735 20%, #090a0f 100%)"; +function Add_Rain(dynamicBackgroundContainer) { + if (dynamicBackgroundContainer) { + let effect = dynamicBackgroundContainer.createEl("div", { cls: "odb-dt-rain-dynamic-effect" }); + let drop1 = ''; + let drop2 = ''; + let drop3 = ''; + let drop4 = ''; + let drop5 = ''; + let drop6 = ''; + let drop7 = ''; + let drop8 = ''; + let drop9 = ''; + let drop10 = ''; + let drop11 = ''; + let drop12 = ''; + let drop13 = ''; + let drop14 = ''; + let drop15 = ''; + let drop16 = ''; + let drops = drop1 + drop2 + drop3 + drop4 + drop5 + drop6 + drop7 + drop8 + drop9 + drop10; + drops += drop11 + drop12 + drop13 + drop14 + drop15 + drop16; + effect.innerHTML += drops; + } +} +function Remove_Rain(dynamicBackgroundContainer) { + let effect = dynamicBackgroundContainer.find("div.odb-dt-rain-dynamic-effect"); + if (effect) { + effect.remove(); + } +} + +// effects/dark-dynamic-random-circle.ts +var DarkTheme_Random_Circle_Background_Property = "radial-gradient(ellipse at bottom, #1b2735 20%, #090a0f 100%)"; +function Add_RandomCircle(dynamicBackgroundContainer) { + let effectScript; + if (dynamicBackgroundContainer) { + let effect = dynamicBackgroundContainer.createEl("div", { cls: "odb-dt-random-circle-dynamic-effect" }); + effect.createEl("canvas"); + let code = ` + var odb_random_circle_ctx; + var odb_random_circle_grd; + + function Obsidian_Dynamic_Background_Start() { + var canvas = document.querySelector("div.odb-dt-random-circle-dynamic-effect canvas"); + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + + odb_random_circle_ctx = canvas.getContext("2d"); + + odb_random_circle_grd = odb_random_circle_ctx.createLinearGradient(0, window.innerHeight, 0, 0); + + odb_random_circle_ctx.fillStyle = odb_random_circle_grd; + odb_random_circle_ctx.fillRect(0, 0, window.innerWidth, window.innerHeight); + + Obsidian_Dynamic_Background_Animate(); + } + + function Obsidian_Dynamic_Background_Firework(x, y) { + this.x = x; + this.y = y; + this.radius = 5; + this.time = 0; + this.lifespan = Math.random()*180 + 150; + + this.draw = function() { + odb_random_circle_ctx.beginPath(); + odb_random_circle_ctx.arc(this.x, window.innerHeight - this.y, this.radius, 0, 2*Math.PI, false); + var alpha = (this.lifespan - this.time)/this.lifespan; + odb_random_circle_ctx.strokeStyle = "rgba(255, 255, 255, " + alpha + ")"; + odb_random_circle_ctx.stroke(); + } + + this.update = function() { + if (this.time < this.lifespan) { + this.radius += .25; + this.time += 1; + this.draw(); + } + } + } + + var fireworks = []; + var time = 0; + + function Obsidian_Dynamic_Background_Animate() { + odb_random_circle_ctx.clearRect(0, 0, window.innerWidth, window.innerHeight); + odb_random_circle_ctx.fillStyle = odb_random_circle_grd; + odb_random_circle_ctx.fillRect(0, 0, window.innerWidth, window.innerHeight); + + if (time % Math.floor(Math.random()*100 + 40) == 0) { + var x = Math.floor(Math.random()*window.innerWidth); + var y = Math.floor(Math.random()*window.innerHeight); + fireworks.push(new Obsidian_Dynamic_Background_Firework(x, y)); + } + + fireworks.forEach(firework => { + firework.update(); + if ((firework.time - firework.explosionTime) > 20) { + for (var i = 0; i < fireworks.length; i++) { + if (firework === fireworks[i]) { + delete fireworks[i]; + } + } + } + }) + + time += 1; + + if (Obsidian_Dynamic_Background_Animate) + requestAnimationFrame(Obsidian_Dynamic_Background_Animate); + } + + Obsidian_Dynamic_Background_Start(); + `; + effectScript = effect.createEl("script"); + effectScript.textContent = code; + } +} +function Remove_RandomCircle(dynamicBackgroundContainer) { + let effect = dynamicBackgroundContainer.find("div.odb-dt-random-circle-dynamic-effect"); + if (effect) { + effect.remove(); + } + Unload_Effect_Script(); +} +function Unload_Effect_Script() { + window["Obsidian_Dynamic_Background_Start"] = null; + window["Obsidian_Dynamic_Background_Firework"] = null; + window["Obsidian_Dynamic_Background_Animate"] = null; +} + +// effects/light-dynamic-random-circle.ts +var LightTheme_Random_Circle_Background_Property = "linear-gradient(0deg, rgba(255,255,255,1) 62%, rgba(230,244,255,1) 100%)"; +function Add_RandomCircle_Light(dynamicBackgroundContainer) { + let effectScript; + if (dynamicBackgroundContainer) { + let effect = dynamicBackgroundContainer.createEl("div", { cls: "odb-lt-random-circle-dynamic-effect" }); + effect.createEl("canvas"); + let code = ` + var odb_random_circle_ctx; + var odb_random_circle_grd; + + function Obsidian_Dynamic_Background_Start() { + var canvas = document.querySelector("div.odb-lt-random-circle-dynamic-effect canvas"); + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + + odb_random_circle_ctx = canvas.getContext("2d"); + + odb_random_circle_grd = odb_random_circle_ctx.createLinearGradient(0, window.innerHeight, 0, 0); + + odb_random_circle_ctx.fillStyle = odb_random_circle_grd; + odb_random_circle_ctx.fillRect(0, 0, window.innerWidth, window.innerHeight); + + Obsidian_Dynamic_Background_Animate(); + } + + function Obsidian_Dynamic_Background_Firework(x, y) { + this.x = x; + this.y = y; + this.radius = 5; + this.time = 0; + this.lifespan = Math.random()*180 + 150; + + this.draw = function() { + odb_random_circle_ctx.beginPath(); + odb_random_circle_ctx.arc(this.x, window.innerHeight - this.y, this.radius, 0, 2*Math.PI, false); + var alpha = (this.lifespan - this.time)/this.lifespan; + odb_random_circle_ctx.strokeStyle = "rgba(0, 128, 255, " + alpha + ")"; + odb_random_circle_ctx.stroke(); + } + + this.update = function() { + if (this.time < this.lifespan) { + this.radius += .25; + this.time += 1; + this.draw(); + } + } + } + + var fireworks = []; + var time = 0; + + function Obsidian_Dynamic_Background_Animate() { + odb_random_circle_ctx.clearRect(0, 0, window.innerWidth, window.innerHeight); + odb_random_circle_ctx.fillStyle = odb_random_circle_grd; + odb_random_circle_ctx.fillRect(0, 0, window.innerWidth, window.innerHeight); + + if (time % Math.floor(Math.random()*100 + 40) == 0) { + var x = Math.floor(Math.random()*window.innerWidth); + var y = Math.floor(Math.random()*window.innerHeight); + fireworks.push(new Obsidian_Dynamic_Background_Firework(x, y)); + } + + fireworks.forEach(firework => { + firework.update(); + if ((firework.time - firework.explosionTime) > 20) { + for (var i = 0; i < fireworks.length; i++) { + if (firework === fireworks[i]) { + delete fireworks[i]; + } + } + } + }) + + time += 1; + + if (Obsidian_Dynamic_Background_Animate) + requestAnimationFrame(Obsidian_Dynamic_Background_Animate); + } + + Obsidian_Dynamic_Background_Start(); + `; + effectScript = effect.createEl("script"); + effectScript.textContent = code; + } +} +function Remove_RandomCircle_Light(dynamicBackgroundContainer) { + let effect = dynamicBackgroundContainer.find("div.odb-lt-random-circle-dynamic-effect"); + if (effect) { + effect.remove(); + } + Unload_Effect_Script2(); +} +function Unload_Effect_Script2() { + window["Obsidian_Dynamic_Background_Start"] = null; + window["Obsidian_Dynamic_Background_Firework"] = null; + window["Obsidian_Dynamic_Background_Animate"] = null; +} + +// effects/light-dynamic-wave.ts +var LightTheme_Wave_Background_Property = "linear-gradient(0deg, rgba(255,255,255,1) 60%, rgba(201,233,255,1) 100%)"; +function Add_Wave_Light(dynamicBackgroundContainer) { + let effectScript; + if (dynamicBackgroundContainer) { + let effect = dynamicBackgroundContainer.createEl("div", { cls: "odb-lt-wave-effect" }); + effect.createEl("div", { cls: "ocean" }); + let code = ` + function Obsidian_Dynamic_Background_ShowWave() { + var ocean = document.querySelector("div.odb-lt-wave-effect div.ocean"), + waveWidth = 10, + waveCount = Math.floor(window.innerWidth/waveWidth), + docFrag = document.createDocumentFragment(); + + for(var i = 0; i < waveCount; i++){ + var wave = document.createElement("div"); + wave.className += " wave-0723"; + docFrag.appendChild(wave); + wave.style.left = i * waveWidth + "px"; + wave.style.webkitAnimationDelay = (i/100) + "s"; + } + + ocean.appendChild(docFrag); + } + + Obsidian_Dynamic_Background_ShowWave(); + `; + effectScript = effect.createEl("script"); + effectScript.textContent = code; + } +} +function Remove_Wave_Light(dynamicBackgroundContainer) { + let effect = dynamicBackgroundContainer.find("div.odb-lt-wave-effect"); + if (effect) { + effect.remove(); + } + Unload_Effect_Script3(); +} +function Unload_Effect_Script3() { + window["Obsidian_Dynamic_Background_ShowWave"] = null; +} + +// effects/dark-dynamic-digital-rain.ts +var DarkTheme_Digital_Rain_Background_Property = "radial-gradient(ellipse at bottom, #1b2735 20%, #090a0f 100%)"; +function Add_DigitalRain(dynamicBackgroundContainer) { + let effectScript; + if (dynamicBackgroundContainer) { + let effect = dynamicBackgroundContainer.createEl("div", { cls: "odb-dt-digital-rain-dynamic-effect" }); + effect.createEl("canvas"); + let code = ` + var odb_digital_rain_canvas + var odb_digital_rain_ctx; + var odb_digital_rain_grd; + var odb_digital_rain_digitals = "1001101010110101010101010010101010101011101111010101010110101010101010101110010101"; + var odb_digital_rain_font_size = 15; + var odb_digital_rain_columns; //number of columns for the rain + var odb_digital_rain_drops = []; //an array of drops - one per column + var odb_digital_rain_interval; + + function Obsidian_Dynamic_Background_Draw(){ + odb_digital_rain_ctx.fillStyle = "rgba(0, 0, 0, 0.1)"; + odb_digital_rain_ctx.fillRect(0, 0, odb_digital_rain_canvas.width, odb_digital_rain_canvas.height); + + odb_digital_rain_ctx.fillStyle = "#0F0"; + odb_digital_rain_ctx.font = odb_digital_rain_font_size + "px arial"; + + for(var i = 0; i < odb_digital_rain_drops.length; i++) + { + var digital = odb_digital_rain_digitals[Math.floor(Math.random()*odb_digital_rain_digitals.length)]; + + odb_digital_rain_ctx.fillText(digital, i*odb_digital_rain_font_size, odb_digital_rain_drops[i]*odb_digital_rain_font_size); + + if(odb_digital_rain_drops[i]*odb_digital_rain_font_size > odb_digital_rain_canvas.height && Math.random() > 0.975) + odb_digital_rain_drops[i] = 0; + + odb_digital_rain_drops[i]++; + } + } + + function Obsidian_Dynamic_Background_Start() { + odb_digital_rain_canvas = document.querySelector("div.odb-dt-digital-rain-dynamic-effect canvas"); + odb_digital_rain_canvas.width = window.innerWidth; + odb_digital_rain_canvas.height = window.innerHeight; + + odb_digital_rain_ctx = odb_digital_rain_canvas.getContext("2d"); + odb_digital_rain_ctx.globalAlpha = 1; + odb_digital_rain_ctx.globalCompositeOperation = "xor"; + + odb_digital_rain_columns = odb_digital_rain_canvas.width/odb_digital_rain_font_size; + + for(var x = 0; x < odb_digital_rain_columns; x++) + odb_digital_rain_drops[x] = 1; + } + + function Obsidian_Dynamic_Background_SetBrightness(brightness) { + odb_digital_rain_canvas.width = window.innerWidth; // clear canvas + odb_digital_rain_ctx.globalCompositeOperation = "xor"; + odb_digital_rain_ctx.globalAlpha = brightness; + } + + function Obsidian_Dynamic_Background_Clear() { + clearInterval(odb_digital_rain_interval); + } + + Obsidian_Dynamic_Background_Start(); + odb_digital_rain_interval = setInterval(Obsidian_Dynamic_Background_Draw, 80); + `; + effectScript = effect.createEl("script"); + effectScript.textContent = code; + } +} +function Remove_DigitalRain(dynamicBackgroundContainer) { + let effect = dynamicBackgroundContainer.find("div.odb-dt-digital-rain-dynamic-effect"); + if (effect) { + CallClear(dynamicBackgroundContainer); + effect.remove(); + } + Unload_Effect_Script4(); +} +function Unload_Effect_Script4() { + window["Obsidian_Dynamic_Background_Start"] = null; + window["Obsidian_Dynamic_Background_Draw"] = null; + window["Obsidian_Dynamic_Background_Clear"] = null; + window["Obsidian_Dynamic_Background_SetBrightness"] = null; +} +function CallClear(dynamicBackgroundContainer) { + let effectScript; + let effect = dynamicBackgroundContainer.find("div.odb-dt-digital-rain-dynamic-effect"); + let code = ` + Obsidian_Dynamic_Background_Clear(); + `; + effectScript = effect.createEl("script"); + effectScript.textContent = code; +} +function SetBrightness(dynamicBackgroundContainer, brightness) { + let setBrightnessScript; + let setBrightnessScriptContainer; + let effect = dynamicBackgroundContainer.find("div.odb-dt-digital-rain-dynamic-effect"); + if (effect) { + let setBrightnessScriptContainer2 = dynamicBackgroundContainer.find("div.odb-dt-digital-rain-dynamic-effect div.set-brightness-script-container"); + if (setBrightnessScriptContainer2) { + setBrightnessScriptContainer2.remove(); + } + setBrightnessScriptContainer2 = effect.createEl("div", { cls: "div.set-brightness-script-container" }); + let code = "Obsidian_Dynamic_Background_SetBrightness(" + brightness + ")"; + setBrightnessScript = setBrightnessScriptContainer2.createEl("script"); + setBrightnessScript.textContent = code; + } +} + +// main.ts +var DEFAULT_SETTINGS = { + dynamicEffect: 1 /* Dark_StarSky */, + digitalRainBrightness: 0.7, + enableDynamicEffect: true, + backgroundImageFile: "", + blur: 0 +}; +var DynamicBackgroundPlugin = class extends import_obsidian.Plugin { + onload() { + return __async(this, null, function* () { + console.log("loading dynamic background plugin..."); + this.preDynamicEffect = -1 /* Unknown */; + yield this.loadSettings(); + this.addSettingTab(new DynamicBackgroundSettingTab(this.app, this)); + this.app.workspace.onLayoutReady(() => { + this.AddDynamicBackgroundContainer(); + this.SetDynamicBackgroundContainerBgProperty(); + if (this.settings.enableDynamicEffect == true) { + this.AddDynamicBackgroundEffect(this.settings.dynamicEffect); + } + }); + }); + } + onunload() { + console.log("unloading dynamic background plugin..."); + this.RemoveDynamicBackgroundContainer(); + } + loadSettings() { + return __async(this, null, function* () { + this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); + }); + } + saveSettings() { + return __async(this, null, function* () { + yield this.saveData(this.settings); + }); + } + AddDynamicBackgroundContainer() { + let div_root = app.workspace.containerEl.find("div.workspace > div.mod-root"); + this.dynamicBackgroundContainer = null; + if (div_root) { + this.dynamicBackgroundContainer = div_root.createEl("div", { cls: "rh-obsidian-dynamic-background-container" }); + this.wallpaperCover = this.dynamicBackgroundContainer.createEl("div", { cls: "rh-wallpaper-cover" }); + this.SetWallpaperBlur(); + } + } + SetWallpaperBlur() { + let value = "blur(" + this.settings.blur.toString() + "px)"; + this.wallpaperCover.style.setProperty("filter", value); + } + RemoveDynamicBackgroundContainer() { + if (this.dynamicBackgroundContainer) { + this.dynamicBackgroundContainer.remove(); + this.dynamicBackgroundContainer = null; + } + } + SetDynamicBackgroundContainerBgProperty() { + return __async(this, null, function* () { + if (this.dynamicBackgroundContainer == null) + return; + let backgroundImageAlreadySet = false; + let imageFullFilename = ""; + try { + imageFullFilename = this.app.vault.adapter.getResourcePath(this.settings.backgroundImageFile); + } catch (e) { + } + if (imageFullFilename != "") { + this.dynamicBackgroundContainer.style.setProperty("background", 'url("' + imageFullFilename + '"'); + this.dynamicBackgroundContainer.style.setProperty("background-size", "cover"); + this.dynamicBackgroundContainer.style.setProperty("background-position", "center"); + backgroundImageAlreadySet = true; + } else { + this.dynamicBackgroundContainer.style.removeProperty("background"); + this.dynamicBackgroundContainer.style.removeProperty("background-size"); + this.dynamicBackgroundContainer.style.removeProperty("background-position"); + } + if (backgroundImageAlreadySet == false) { + this.dynamicBackgroundContainer.style.removeProperty("background"); + this.dynamicBackgroundContainer.style.removeProperty("background-size"); + this.dynamicBackgroundContainer.style.removeProperty("background-position"); + if (this.settings.enableDynamicEffect == false) + return; + switch (this.settings.dynamicEffect) { + case 1 /* Dark_StarSky */: + break; + case 2 /* Dark_Snow */: + this.dynamicBackgroundContainer.style.setProperty("background", DarkTheme_Snow_Background_Property); + break; + case 3 /* Dark_Rain */: + this.dynamicBackgroundContainer.style.setProperty("background", DarkTheme_Rain_Background_Property); + break; + case 4 /* Dark_RandomCircle */: + this.dynamicBackgroundContainer.style.setProperty("background", DarkTheme_Random_Circle_Background_Property); + break; + case 40 /* Light_RandomCircle */: + this.dynamicBackgroundContainer.style.setProperty("background", LightTheme_Random_Circle_Background_Property); + break; + case 41 /* Light_Wave */: + this.dynamicBackgroundContainer.style.setProperty("background", LightTheme_Wave_Background_Property); + break; + case 5 /* Dark_DigitalRain */: + this.dynamicBackgroundContainer.style.setProperty("background", DarkTheme_Digital_Rain_Background_Property); + } + } + }); + } + SetDigitalRainBrightnessHelper() { + if (this.dynamicBackgroundContainer) { + SetBrightness(this.dynamicBackgroundContainer, this.settings.digitalRainBrightness); + } + } + AddDynamicBackgroundEffect(effect) { + switch (effect) { + case 1 /* Dark_StarSky */: + if (this.dynamicBackgroundContainer) + Add_StarSky(this.dynamicBackgroundContainer); + break; + case 2 /* Dark_Snow */: + if (this.dynamicBackgroundContainer) + Add_Snow(this.dynamicBackgroundContainer); + break; + case 3 /* Dark_Rain */: + if (this.dynamicBackgroundContainer) + Add_Rain(this.dynamicBackgroundContainer); + break; + case 5 /* Dark_DigitalRain */: + if (this.dynamicBackgroundContainer) { + Add_DigitalRain(this.dynamicBackgroundContainer); + this.SetDigitalRainBrightnessHelper(); + } + break; + case 4 /* Dark_RandomCircle */: + if (this.dynamicBackgroundContainer) + Add_RandomCircle(this.dynamicBackgroundContainer); + break; + case 40 /* Light_RandomCircle */: + if (this.dynamicBackgroundContainer) + Add_RandomCircle_Light(this.dynamicBackgroundContainer); + break; + case 41 /* Light_Wave */: + if (this.dynamicBackgroundContainer) + Add_Wave_Light(this.dynamicBackgroundContainer); + break; + } + } + RemoveDynamicBackgroundEffect(effect) { + if (effect == -1 /* Unknown */) + return; + switch (effect) { + case 1 /* Dark_StarSky */: + if (this.dynamicBackgroundContainer) + Remove_StarSky(this.dynamicBackgroundContainer); + break; + case 2 /* Dark_Snow */: + if (this.dynamicBackgroundContainer) + Remove_Snow(this.dynamicBackgroundContainer); + break; + case 3 /* Dark_Rain */: + if (this.dynamicBackgroundContainer) + Remove_Rain(this.dynamicBackgroundContainer); + break; + case 5 /* Dark_DigitalRain */: + if (this.dynamicBackgroundContainer) + Remove_DigitalRain(this.dynamicBackgroundContainer); + break; + case 4 /* Dark_RandomCircle */: + if (this.dynamicBackgroundContainer) + Remove_RandomCircle(this.dynamicBackgroundContainer); + break; + case 40 /* Light_RandomCircle */: + if (this.dynamicBackgroundContainer) + Remove_RandomCircle_Light(this.dynamicBackgroundContainer); + break; + case 41 /* Light_Wave */: + if (this.dynamicBackgroundContainer) + Remove_Wave_Light(this.dynamicBackgroundContainer); + break; + } + } +}; +var DynamicBackgroundSettingTab = class extends import_obsidian.PluginSettingTab { + constructor(app2, plugin) { + super(app2, plugin); + this.plugin = plugin; + } + display() { + const { containerEl } = this; + containerEl.empty(); + containerEl.createEl("h2", { text: "Dynamic Background Plugin - Settings" }); + new import_obsidian.Setting(containerEl).setName("Dynamic Effect").setDesc("Select a dynamic effect").addDropdown((dropdown) => dropdown.addOption(5 /* Dark_DigitalRain */.toString(), "Dark - Matrix / Digital Rain").addOption(3 /* Dark_Rain */.toString(), "Dark - Rain").addOption(4 /* Dark_RandomCircle */.toString(), "Dark - Random Circle").addOption(2 /* Dark_Snow */.toString(), "Dark - Snow").addOption(1 /* Dark_StarSky */.toString(), "Dark - Star Sky").addOption(40 /* Light_RandomCircle */.toString(), "Light - Random Circle").addOption(41 /* Light_Wave */.toString(), "Light - Wave").setValue(this.plugin.settings.dynamicEffect.toString()).onChange((value) => __async(this, null, function* () { + this.plugin.preDynamicEffect = this.plugin.settings.dynamicEffect; + this.plugin.settings.dynamicEffect = Number(value); + yield this.plugin.saveSettings(); + this.plugin.RemoveDynamicBackgroundEffect(this.plugin.preDynamicEffect); + if (this.plugin.settings.enableDynamicEffect == true) + this.plugin.AddDynamicBackgroundEffect(this.plugin.settings.dynamicEffect); + this.plugin.SetDynamicBackgroundContainerBgProperty(); + this.display(); + }))); + if (this.plugin.settings.dynamicEffect == 5 /* Dark_DigitalRain */) { + new import_obsidian.Setting(containerEl).setName("Brightness").setDesc("Set Digital Rain Brightness.").addSlider((tc) => { + tc.setDynamicTooltip().setLimits(0.5, 1, 0.01).setValue(this.plugin.settings.digitalRainBrightness).onChange((value) => __async(this, null, function* () { + this.plugin.settings.digitalRainBrightness = value; + this.plugin.SetDigitalRainBrightnessHelper(); + yield this.plugin.saveSettings(); + })); + }); + } + new import_obsidian.Setting(containerEl).setName("Enable Dynamic Effect").setDesc("Enable or disable dynamic effect").addToggle((tc) => tc.setValue(this.plugin.settings.enableDynamicEffect).onChange((value) => __async(this, null, function* () { + this.plugin.settings.enableDynamicEffect = value; + yield this.plugin.saveSettings(); + if (this.plugin.settings.enableDynamicEffect == false) { + this.plugin.RemoveDynamicBackgroundEffect(this.plugin.settings.dynamicEffect); + } else { + this.plugin.AddDynamicBackgroundEffect(this.plugin.settings.dynamicEffect); + } + }))); + new import_obsidian.Setting(containerEl).setName("Static Wallpaper Image").setDesc("Image file in Vault. Please use the relative path of the image file inside Vault.").addTextArea((text) => text.setValue(this.plugin.settings.backgroundImageFile).setPlaceholder("Example: attachments/moon.jpg or wallpapers/green.png").then((cb) => { + cb.inputEl.style.width = "100%"; + cb.inputEl.rows = 5; + }).onChange((value) => __async(this, null, function* () { + this.plugin.settings.backgroundImageFile = value; + yield this.plugin.saveSettings(); + this.plugin.SetDynamicBackgroundContainerBgProperty(); + }))); + new import_obsidian.Setting(containerEl).setName("Blur").setDesc("The blurriness of the wallpaper, 0 means no blur.").addSlider((tc) => { + tc.setDynamicTooltip().setLimits(0, 100, 1).setValue(this.plugin.settings.blur).onChange((value) => __async(this, null, function* () { + this.plugin.settings.blur = value; + yield this.plugin.saveSettings(); + this.plugin.SetWallpaperBlur(); + })); + }); + } +}; + + +/* nosourcemap */ \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-dynamic-background/manifest.json b/.obsidian/plugins/obsidian-dynamic-background/manifest.json new file mode 100644 index 0000000..3ad426d --- /dev/null +++ b/.obsidian/plugins/obsidian-dynamic-background/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "obsidian-dynamic-background", + "name": "Dynamic Background", + "version": "1.0.6", + "minAppVersion": "0.12.0", + "description": "Adding dynamic effects and/or static wallpapers for Obsidian background", + "author": "Samuel Song", + "authorUrl": "https://www.readinghere.com", + "isDesktopOnly": false +} diff --git a/.obsidian/plugins/obsidian-dynamic-background/styles.css b/.obsidian/plugins/obsidian-dynamic-background/styles.css new file mode 100644 index 0000000..f474dc6 --- /dev/null +++ b/.obsidian/plugins/obsidian-dynamic-background/styles.css @@ -0,0 +1,219 @@ +.workspace, +.workspace-split.mod-root .view-content, +.workspace-split.mod-root .workspace-leaf{ + background:transparent; +} +.workspace-split.mod-root{ + background:transparent; +} + +div.rh-obsidian-dynamic-background-container { + flex-direction: row; + display: flex; + position: absolute; + width: 100% !important; + height: 100%; + overflow: hidden; + z-index: -100; +} + +div.rh-wallpaper-cover { + background: inherit; + position: absolute; + overflow: hidden; + width: 100%; + height: 100%; + z-index: -300; + filter: blur(0px); +} + +div.odb-dt-star-sky-dynamic-effect { + flex: unset !important; + order: -9997; + z-index: 9997; + background: transparent; +} + +div.odb-dt-star-sky-dynamic-effect div.star-sky { + width: 1px !important; + height: 1px !important; + flex: unset !important; + background: transparent; + box-shadow: 1689px 1355px #FFF , 1063px 1628px #FFF , 40px 316px #FFF , 1709px 847px #FFF , 1411px 416px #FFF , 1933px 552px #FFF , 581px 1189px #FFF , 584px 1017px #FFF , 749px 1635px #FFF , 1354px 189px #FFF , 982px 869px #FFF , 633px 610px #FFF , 1063px 230px #FFF , 1340px 1557px #FFF , 188px 734px #FFF , 1617px 1210px #FFF , 1527px 162px #FFF , 673px 946px #FFF , 550px 1644px #FFF , 382px 1478px #FFF , 1413px 1944px #FFF , 161px 1373px #FFF , 885px 1133px #FFF , 561px 127px #FFF , 1881px 1041px #FFF , 1766px 1162px #FFF , 961px 686px #FFF , 1987px 917px #FFF , 1643px 784px #FFF , 1835px 1090px #FFF , 1960px 1488px #FFF , 1300px 126px #FFF , 741px 298px #FFF , 111px 1043px #FFF , 854px 634px #FFF , 472px 780px #FFF , 1531px 1700px #FFF , 1452px 603px #FFF , 1892px 569px #FFF , 196px 188px #FFF , 1348px 1311px #FFF , 456px 69px #FFF , 275px 1033px #FFF , 607px 1763px #FFF , 1608px 189px #FFF , 1425px 250px #FFF , 608px 1763px #FFF , 128px 1815px #FFF , 884px 145px #FFF , 991px 1770px #FFF , 446px 1764px #FFF , 62px 355px #FFF , 1879px 1235px #FFF , 1802px 714px #FFF , 747px 1195px #FFF , 1587px 667px #FFF , 622px 618px #FFF , 1926px 1925px #FFF , 1684px 1624px #FFF , 299px 781px #FFF , 1206px 432px #FFF , 1646px 200px #FFF , 334px 690px #FFF , 1207px 1549px #FFF , 76px 228px #FFF , 9px 647px #FFF , 567px 1998px #FFF , 686px 1867px #FFF , 792px 721px #FFF , 101px 393px #FFF , 1800px 1571px #FFF , 1510px 337px #FFF , 1627px 229px #FFF , 1762px 944px #FFF , 954px 1270px #FFF , 179px 62px #FFF , 365px 1300px #FFF , 1810px 540px #FFF , 566px 466px #FFF , 582px 1492px #FFF , 1896px 1806px #FFF , 77px 431px #FFF , 1806px 1769px #FFF , 100px 1096px #FFF , 606px 1554px #FFF , 509px 1136px #FFF , 403px 985px #FFF , 109px 1849px #FFF , 403px 1936px #FFF , 1323px 245px #FFF , 608px 173px #FFF , 1701px 1154px #FFF , 593px 477px #FFF , 1917px 1265px #FFF , 745px 426px #FFF , 1854px 1004px #FFF , 362px 1119px #FFF , 1170px 1430px #FFF , 268px 174px #FFF , 1641px 906px #FFF , 384px 452px #FFF , 1074px 585px #FFF , 439px 1943px #FFF , 1292px 185px #FFF , 688px 1476px #FFF , 265px 1761px #FFF , 777px 745px #FFF , 698px 43px #FFF , 1219px 1257px #FFF , 854px 668px #FFF , 386px 1633px #FFF , 706px 1326px #FFF , 1344px 1668px #FFF , 959px 760px #FFF , 1611px 1863px #FFF , 501px 1762px #FFF , 1853px 862px #FFF , 1494px 1695px #FFF , 1483px 975px #FFF , 835px 1417px #FFF , 252px 592px #FFF , 1401px 1125px #FFF , 1801px 926px #FFF , 1108px 769px #FFF , 1999px 879px #FFF , 758px 1854px #FFF , 421px 1908px #FFF , 630px 1502px #FFF , 426px 671px #FFF , 676px 227px #FFF , 1890px 1995px #FFF , 1345px 1723px #FFF , 259px 990px #FFF , 317px 573px #FFF , 414px 1173px #FFF , 1000px 58px #FFF , 457px 1311px #FFF , 335px 592px #FFF , 398px 298px #FFF , 981px 729px #FFF , 468px 264px #FFF , 40px 474px #FFF , 173px 1382px #FFF , 1654px 1142px #FFF , 835px 1183px #FFF , 85px 756px #FFF , 1068px 1720px #FFF , 530px 1944px #FFF , 647px 874px #FFF , 1584px 474px #FFF , 1914px 98px #FFF , 430px 1113px #FFF , 1738px 57px #FFF , 1965px 845px #FFF , 1112px 156px #FFF , 1441px 1817px #FFF , 918px 1107px #FFF , 755px 1943px #FFF , 1220px 1057px #FFF , 443px 1713px #FFF , 313px 902px #FFF , 1160px 1702px #FFF , 146px 1533px #FFF , 1385px 30px #FFF , 1565px 1041px #FFF , 1428px 266px #FFF , 900px 598px #FFF , 269px 1115px #FFF , 10px 1003px #FFF , 911px 1441px #FFF , 1828px 820px #FFF , 389px 1328px #FFF , 1042px 1228px #FFF , 218px 940px #FFF , 487px 1221px #FFF , 1135px 193px #FFF , 1081px 1524px #FFF , 430px 995px #FFF , 470px 1068px #FFF , 1091px 648px #FFF , 264px 785px #FFF , 1540px 422px #FFF , 1927px 339px #FFF , 1718px 451px #FFF , 827px 1357px #FFF , 1446px 1653px #FFF , 1064px 1512px #FFF , 1178px 748px #FFF , 1809px 1571px #FFF , 1737px 663px #FFF , 2px 701px #FFF , 417px 1883px #FFF , 1171px 853px #FFF , 815px 42px #FFF , 1794px 1235px #FFF , 1022px 921px #FFF , 413px 1896px #FFF , 1465px 189px #FFF , 867px 10px #FFF , 38px 1395px #FFF , 1361px 1418px #FFF , 289px 1410px #FFF , 1672px 1272px #FFF , 1756px 1117px #FFF , 332px 1340px #FFF , 1412px 1894px #FFF , 1783px 1278px #FFF , 623px 1290px #FFF , 1999px 760px #FFF , 506px 1986px #FFF , 1595px 219px #FFF , 1822px 188px #FFF , 472px 1700px #FFF , 1385px 1263px #FFF , 1370px 210px #FFF , 1689px 1972px #FFF , 171px 1527px #FFF , 1387px 883px #FFF , 1875px 1718px #FFF , 1739px 1652px #FFF , 1603px 1890px #FFF , 934px 1821px #FFF , 12px 1645px #FFF , 1044px 1644px #FFF , 213px 1785px #FFF , 1151px 53px #FFF , 1430px 1930px #FFF , 1781px 1038px #FFF , 818px 1573px #FFF , 191px 45px #FFF , 519px 1277px #FFF , 629px 758px #FFF , 299px 1064px #FFF , 1980px 742px #FFF , 625px 1771px #FFF , 1470px 3px #FFF , 1971px 1160px #FFF , 1476px 1400px #FFF , 1784px 486px #FFF , 271px 185px #FFF , 358px 1388px #FFF , 853px 1062px #FFF , 1799px 1672px #FFF , 1941px 768px #FFF , 177px 1607px #FFF , 1305px 1763px #FFF , 84px 1245px #FFF , 792px 1201px #FFF , 1646px 159px #FFF , 468px 1095px #FFF , 1136px 1424px #FFF , 179px 327px #FFF , 1966px 544px #FFF , 859px 1323px #FFF , 274px 1264px #FFF , 595px 777px #FFF , 556px 1702px #FFF , 535px 810px #FFF , 1534px 856px #FFF , 226px 468px #FFF , 1271px 441px #FFF , 1014px 1557px #FFF , 206px 1061px #FFF , 1090px 1903px #FFF , 1802px 976px #FFF , 719px 412px #FFF , 248px 591px #FFF , 5px 1062px #FFF , 1235px 1962px #FFF , 1197px 1064px #FFF , 241px 340px #FFF , 303px 495px #FFF , 1662px 33px #FFF , 1819px 525px #FFF , 961px 256px #FFF , 287px 263px #FFF , 1138px 1032px #FFF , 962px 1596px #FFF , 420px 614px #FFF , 1665px 1713px #FFF , 921px 1184px #FFF , 52px 1547px #FFF , 935px 177px #FFF , 1638px 1884px #FFF , 881px 957px #FFF , 979px 893px #FFF , 1307px 1199px #FFF , 696px 190px #FFF , 1371px 781px #FFF , 79px 1799px #FFF , 146px 1015px #FFF , 1101px 1025px #FFF , 955px 1200px #FFF , 1267px 1241px #FFF , 73px 7px #FFF , 546px 16px #FFF , 1680px 1570px #FFF , 719px 1523px #FFF , 1391px 229px #FFF , 1865px 60px #FFF , 1265px 1511px #FFF , 1293px 141px #FFF , 390px 168px #FFF , 329px 504px #FFF , 1102px 801px #FFF , 1759px 810px #FFF , 1536px 128px #FFF , 38px 1566px #FFF , 1043px 721px #FFF , 1439px 174px #FFF , 1427px 285px #FFF , 507px 922px #FFF , 1136px 860px #FFF , 1838px 869px #FFF , 1606px 1052px #FFF , 919px 1024px #FFF , 748px 935px #FFF , 1110px 769px #FFF , 1625px 206px #FFF , 46px 1454px #FFF , 1353px 441px #FFF , 1462px 215px #FFF , 404px 681px #FFF , 580px 777px #FFF , 1376px 694px #FFF , 305px 374px #FFF , 648px 462px #FFF , 216px 97px #FFF , 944px 1715px #FFF , 1384px 665px #FFF , 1886px 1883px #FFF , 1731px 1610px #FFF , 939px 576px #FFF , 1401px 1390px #FFF , 793px 1596px #FFF , 1616px 1966px #FFF , 547px 1259px #FFF , 1042px 98px #FFF , 754px 646px #FFF , 506px 508px #FFF , 1211px 230px #FFF , 782px 225px #FFF , 596px 1652px #FFF , 199px 1390px #FFF , 1199px 1613px #FFF , 1386px 971px #FFF , 798px 217px #FFF , 2px 1951px #FFF , 910px 801px #FFF , 60px 1194px #FFF , 1847px 1370px #FFF , 252px 1901px #FFF , 1293px 654px #FFF , 1398px 1232px #FFF , 864px 1873px #FFF , 1568px 896px #FFF , 1744px 1836px #FFF , 584px 1044px #FFF , 1565px 896px #FFF , 649px 676px #FFF , 1908px 459px #FFF , 1585px 24px #FFF , 1206px 295px #FFF , 143px 1318px #FFF , 1987px 1398px #FFF , 1186px 675px #FFF , 368px 1906px #FFF , 1553px 1631px #FFF , 1646px 1889px #FFF , 1690px 416px #FFF , 995px 597px #FFF , 220px 1893px #FFF , 204px 776px #FFF , 1548px 1490px #FFF , 737px 1459px #FFF , 1748px 1472px #FFF , 455px 632px #FFF , 559px 299px #FFF , 341px 1725px #FFF , 668px 1434px #FFF , 1732px 1773px #FFF , 1773px 354px #FFF , 1014px 1758px #FFF , 841px 1012px #FFF , 134px 917px #FFF , 37px 393px #FFF , 499px 1240px #FFF , 672px 1738px #FFF , 235px 113px #FFF , 1783px 220px #FFF , 1490px 1111px #FFF , 195px 1198px #FFF , 373px 1919px #FFF , 1607px 449px #FFF , 1430px 1222px #FFF , 620px 856px #FFF , 1881px 1692px #FFF , 125px 152px #FFF , 575px 115px #FFF , 181px 1533px #FFF , 595px 1003px #FFF , 1354px 1748px #FFF , 801px 12px #FFF , 1880px 1002px #FFF , 1197px 272px #FFF , 993px 238px #FFF , 1848px 448px #FFF , 515px 1484px #FFF , 567px 1540px #FFF , 1396px 1191px #FFF , 294px 1492px #FFF , 943px 1752px #FFF , 136px 1632px #FFF , 1945px 656px #FFF , 739px 629px #FFF , 812px 1664px #FFF , 1905px 904px #FFF , 310px 1972px #FFF , 224px 483px #FFF , 1770px 944px #FFF , 1009px 354px #FFF , 1062px 878px #FFF , 275px 1499px #FFF , 1487px 1196px #FFF , 1436px 1816px #FFF , 1923px 1408px #FFF , 1708px 976px #FFF , 1157px 1935px #FFF , 1166px 1835px #FFF , 928px 288px #FFF , 957px 595px #FFF , 1124px 138px #FFF , 1249px 1692px #FFF , 1247px 1478px #FFF , 528px 758px #FFF , 1000px 1824px #FFF , 1660px 286px #FFF , 1679px 1991px #FFF , 1532px 820px #FFF , 716px 1266px #FFF , 157px 1665px #FFF , 1409px 1997px #FFF , 569px 339px #FFF , 854px 978px #FFF , 1444px 1124px #FFF , 319px 1568px #FFF , 478px 37px #FFF , 1452px 1924px #FFF , 269px 1068px #FFF , 20px 338px #FFF , 1068px 1579px #FFF , 488px 1471px #FFF , 1584px 1493px #FFF , 344px 1109px #FFF , 1256px 861px #FFF , 1053px 1751px #FFF , 363px 1889px #FFF , 1892px 64px #FFF , 1021px 1923px #FFF , 1066px 215px #FFF , 684px 896px #FFF , 732px 672px #FFF , 380px 842px #FFF , 537px 1714px #FFF , 984px 1890px #FFF , 115px 1739px #FFF , 1183px 1977px #FFF , 419px 1366px #FFF , 1152px 1061px #FFF , 1628px 615px #FFF , 1297px 694px #FFF , 149px 842px #FFF , 948px 1623px #FFF , 1671px 1609px #FFF , 770px 1884px #FFF , 1393px 1117px #FFF , 346px 1537px #FFF , 597px 700px #FFF , 1283px 1882px #FFF , 1789px 382px #FFF , 190px 505px #FFF , 1002px 662px #FFF , 285px 1640px #FFF , 911px 1974px #FFF , 442px 1536px #FFF , 1631px 339px #FFF , 1222px 16px #FFF , 1820px 1888px #FFF , 356px 1792px #FFF , 835px 1845px #FFF , 97px 456px #FFF , 1909px 688px #FFF , 1850px 1163px #FFF , 692px 876px #FFF , 1777px 1763px #FFF , 229px 919px #FFF , 873px 1473px #FFF , 374px 1194px #FFF , 1233px 1686px #FFF , 647px 23px #FFF , 1580px 1326px #FFF , 935px 891px #FFF , 829px 769px #FFF , 1808px 934px #FFF , 643px 1536px #FFF , 865px 1362px #FFF , 410px 505px #FFF , 550px 1494px #FFF , 532px 43px #FFF , 162px 404px #FFF , 1128px 492px #FFF , 1185px 29px #FFF , 1432px 123px #FFF , 360px 836px #FFF , 1030px 1508px #FFF , 1080px 559px #FFF , 1521px 993px #FFF , 1409px 931px #FFF , 1988px 46px #FFF , 553px 1090px #FFF , 1326px 584px #FFF , 432px 723px #FFF , 1900px 889px #FFF , 1366px 1328px #FFF , 1176px 1977px #FFF , 712px 627px #FFF , 865px 1581px #FFF , 1630px 288px #FFF , 350px 889px #FFF , 1520px 1702px #FFF , 574px 61px #FFF , 770px 641px #FFF , 190px 1352px #FFF , 731px 1718px #FFF , 1775px 853px #FFF , 318px 872px #FFF , 1320px 935px #FFF , 1731px 709px #FFF , 462px 1887px #FFF , 1986px 1379px #FFF , 1257px 903px #FFF , 1163px 947px #FFF , 490px 925px #FFF , 1595px 1274px #FFF , 1186px 1462px #FFF , 362px 76px #FFF , 826px 1410px #FFF , 575px 1099px #FFF , 1015px 1884px #FFF , 1670px 1761px #FFF , 1793px 812px #FFF , 427px 1834px #FFF , 221px 1176px #FFF , 1990px 499px #FFF , 892px 1983px #FFF , 1046px 1126px #FFF , 1402px 808px #FFF , 1167px 807px #FFF , 1185px 520px #FFF , 1468px 211px #FFF , 1564px 1238px #FFF , 589px 315px #FFF , 390px 1706px #FFF , 533px 1661px #FFF , 916px 1864px #FFF , 1154px 1334px #FFF , 1117px 15px #FFF , 1445px 189px #FFF , 864px 1949px #FFF , 205px 1495px #FFF , 1695px 1847px #FFF , 1991px 1460px #FFF , 1156px 1000px #FFF , 1767px 1367px #FFF , 875px 97px #FFF , 1619px 1770px #FFF , 1104px 1170px #FFF , 1781px 1022px #FFF , 835px 413px #FFF , 1104px 1103px #FFF , 550px 1919px #FFF , 1476px 1823px #FFF , 1109px 639px #FFF , 1642px 220px #FFF , 834px 517px #FFF , 1621px 980px #FFF , 690px 1528px #FFF , 1654px 591px #FFF , 1976px 1665px #FFF , 582px 1510px #FFF , 1019px 991px #FFF , 1525px 1038px #FFF , 713px 206px #FFF , 1252px 572px #FFF , 483px 1002px #FFF , 718px 1918px #FFF , 1443px 324px #FFF , 51px 1363px #FFF , 468px 1416px #FFF , 1809px 764px #FFF , 1789px 411px #FFF , 642px 1761px #FFF , 667px 1725px #FFF , 272px 1755px #FFF , 1513px 894px #FFF , 1098px 43px #FFF , 936px 986px #FFF , 1414px 601px #FFF , 411px 46px #FFF , 516px 223px #FFF , 1891px 700px #FFF , 646px 4px #FFF , 53px 1050px #FFF , 1799px 795px #FFF , 157px 25px #FFF , 1951px 1741px #FFF , 271px 528px #FFF , 33px 259px #FFF , 1443px 1775px #FFF , 1604px 942px #FFF , 1750px 1561px #FFF , 702px 1571px #FFF , 104px 1411px #FFF , 1554px 1278px #FFF , 1527px 451px #FFF , 1647px 216px #FFF , 1152px 437px #FFF , 614px 1697px #FFF , 429px 1081px #FFF , 1491px 1282px #FFF , 560px 364px #FFF , 1057px 1762px #FFF , 1523px 2000px #FFF , 794px 1445px #FFF , 981px 434px #FFF , 1124px 779px #FFF , 104px 617px #FFF , 1607px 153px #FFF , 963px 1244px #FFF , 1880px 639px #FFF , 194px 1171px #FFF , 1309px 1201px #FFF , 1517px 1575px #FFF , 987px 382px #FFF , 347px 500px #FFF , 888px 1077px #FFF , 1272px 1967px #FFF , 1764px 71px #FFF , 705px 366px #FFF , 1451px 918px #FFF , 1945px 835px #FFF , 786px 1282px #FFF , 393px 8px #FFF , 764px 1209px #FFF , 115px 1132px #FFF , 712px 998px #FFF , 1840px 1657px #FFF , 342px 792px #FFF , 488px 866px #FFF , 1908px 1538px #FFF , 678px 1972px #FFF , 1672px 446px #FFF , 1617px 969px #FFF , 1175px 1414px #FFF , 778px 1385px #FFF , 986px 1722px #FFF , 1926px 677px #FFF , 132px 687px #FFF , 643px 1254px #FFF , 514px 22px #FFF , 653px 1464px #FFF , 163px 857px #FFF , 1765px 1577px #FFF , 491px 1195px #FFF , 109px 792px #FFF , 359px 1565px #FFF , 1999px 1335px #FFF , 720px 74px #FFF , 1310px 1914px #FFF , 817px 1085px #FFF , 938px 297px #FFF , 1798px 245px #FFF , 914px 1725px #FFF , 589px 710px #FFF , 578px 53px #FFF , 128px 791px #FFF , 930px 483px #FFF , 189px 987px #FFF , 882px 1877px #FFF , 61px 426px #FFF , 693px 317px #FFF , 327px 930px #FFF , 578px 19px #FFF , 610px 867px #FFF , 1777px 404px #FFF , 877px 422px #FFF , 1759px 1565px #FFF , 382px 1777px #FFF , 769px 1151px #FFF , 1147px 1418px #FFF; + animation: animation-stars 50s linear infinite; +} + +div.odb-dt-star-sky-dynamic-effect:after { + content: " "; + position: absolute; + top: 2000px; + width: 1px; + height: 1px; + background: transparent; + box-shadow: 1689px 1355px #FFF , 1063px 1628px #FFF , 40px 316px #FFF , 1709px 847px #FFF , 1411px 416px #FFF , 1933px 552px #FFF , 581px 1189px #FFF , 584px 1017px #FFF , 749px 1635px #FFF , 1354px 189px #FFF , 982px 869px #FFF , 633px 610px #FFF , 1063px 230px #FFF , 1340px 1557px #FFF , 188px 734px #FFF , 1617px 1210px #FFF , 1527px 162px #FFF , 673px 946px #FFF , 550px 1644px #FFF , 382px 1478px #FFF , 1413px 1944px #FFF , 161px 1373px #FFF , 885px 1133px #FFF , 561px 127px #FFF , 1881px 1041px #FFF , 1766px 1162px #FFF , 961px 686px #FFF , 1987px 917px #FFF , 1643px 784px #FFF , 1835px 1090px #FFF , 1960px 1488px #FFF , 1300px 126px #FFF , 741px 298px #FFF , 111px 1043px #FFF , 854px 634px #FFF , 472px 780px #FFF , 1531px 1700px #FFF , 1452px 603px #FFF , 1892px 569px #FFF , 196px 188px #FFF , 1348px 1311px #FFF , 456px 69px #FFF , 275px 1033px #FFF , 607px 1763px #FFF , 1608px 189px #FFF , 1425px 250px #FFF , 608px 1763px #FFF , 128px 1815px #FFF , 884px 145px #FFF , 991px 1770px #FFF , 446px 1764px #FFF , 62px 355px #FFF , 1879px 1235px #FFF , 1802px 714px #FFF , 747px 1195px #FFF , 1587px 667px #FFF , 622px 618px #FFF , 1926px 1925px #FFF , 1684px 1624px #FFF , 299px 781px #FFF , 1206px 432px #FFF , 1646px 200px #FFF , 334px 690px #FFF , 1207px 1549px #FFF , 76px 228px #FFF , 9px 647px #FFF , 567px 1998px #FFF , 686px 1867px #FFF , 792px 721px #FFF , 101px 393px #FFF , 1800px 1571px #FFF , 1510px 337px #FFF , 1627px 229px #FFF , 1762px 944px #FFF , 954px 1270px #FFF , 179px 62px #FFF , 365px 1300px #FFF , 1810px 540px #FFF , 566px 466px #FFF , 582px 1492px #FFF , 1896px 1806px #FFF , 77px 431px #FFF , 1806px 1769px #FFF , 100px 1096px #FFF , 606px 1554px #FFF , 509px 1136px #FFF , 403px 985px #FFF , 109px 1849px #FFF , 403px 1936px #FFF , 1323px 245px #FFF , 608px 173px #FFF , 1701px 1154px #FFF , 593px 477px #FFF , 1917px 1265px #FFF , 745px 426px #FFF , 1854px 1004px #FFF , 362px 1119px #FFF , 1170px 1430px #FFF , 268px 174px #FFF , 1641px 906px #FFF , 384px 452px #FFF , 1074px 585px #FFF , 439px 1943px #FFF , 1292px 185px #FFF , 688px 1476px #FFF , 265px 1761px #FFF , 777px 745px #FFF , 698px 43px #FFF , 1219px 1257px #FFF , 854px 668px #FFF , 386px 1633px #FFF , 706px 1326px #FFF , 1344px 1668px #FFF , 959px 760px #FFF , 1611px 1863px #FFF , 501px 1762px #FFF , 1853px 862px #FFF , 1494px 1695px #FFF , 1483px 975px #FFF , 835px 1417px #FFF , 252px 592px #FFF , 1401px 1125px #FFF , 1801px 926px #FFF , 1108px 769px #FFF , 1999px 879px #FFF , 758px 1854px #FFF , 421px 1908px #FFF , 630px 1502px #FFF , 426px 671px #FFF , 676px 227px #FFF , 1890px 1995px #FFF , 1345px 1723px #FFF , 259px 990px #FFF , 317px 573px #FFF , 414px 1173px #FFF , 1000px 58px #FFF , 457px 1311px #FFF , 335px 592px #FFF , 398px 298px #FFF , 981px 729px #FFF , 468px 264px #FFF , 40px 474px #FFF , 173px 1382px #FFF , 1654px 1142px #FFF , 835px 1183px #FFF , 85px 756px #FFF , 1068px 1720px #FFF , 530px 1944px #FFF , 647px 874px #FFF , 1584px 474px #FFF , 1914px 98px #FFF , 430px 1113px #FFF , 1738px 57px #FFF , 1965px 845px #FFF , 1112px 156px #FFF , 1441px 1817px #FFF , 918px 1107px #FFF , 755px 1943px #FFF , 1220px 1057px #FFF , 443px 1713px #FFF , 313px 902px #FFF , 1160px 1702px #FFF , 146px 1533px #FFF , 1385px 30px #FFF , 1565px 1041px #FFF , 1428px 266px #FFF , 900px 598px #FFF , 269px 1115px #FFF , 10px 1003px #FFF , 911px 1441px #FFF , 1828px 820px #FFF , 389px 1328px #FFF , 1042px 1228px #FFF , 218px 940px #FFF , 487px 1221px #FFF , 1135px 193px #FFF , 1081px 1524px #FFF , 430px 995px #FFF , 470px 1068px #FFF , 1091px 648px #FFF , 264px 785px #FFF , 1540px 422px #FFF , 1927px 339px #FFF , 1718px 451px #FFF , 827px 1357px #FFF , 1446px 1653px #FFF , 1064px 1512px #FFF , 1178px 748px #FFF , 1809px 1571px #FFF , 1737px 663px #FFF , 2px 701px #FFF , 417px 1883px #FFF , 1171px 853px #FFF , 815px 42px #FFF , 1794px 1235px #FFF , 1022px 921px #FFF , 413px 1896px #FFF , 1465px 189px #FFF , 867px 10px #FFF , 38px 1395px #FFF , 1361px 1418px #FFF , 289px 1410px #FFF , 1672px 1272px #FFF , 1756px 1117px #FFF , 332px 1340px #FFF , 1412px 1894px #FFF , 1783px 1278px #FFF , 623px 1290px #FFF , 1999px 760px #FFF , 506px 1986px #FFF , 1595px 219px #FFF , 1822px 188px #FFF , 472px 1700px #FFF , 1385px 1263px #FFF , 1370px 210px #FFF , 1689px 1972px #FFF , 171px 1527px #FFF , 1387px 883px #FFF , 1875px 1718px #FFF , 1739px 1652px #FFF , 1603px 1890px #FFF , 934px 1821px #FFF , 12px 1645px #FFF , 1044px 1644px #FFF , 213px 1785px #FFF , 1151px 53px #FFF , 1430px 1930px #FFF , 1781px 1038px #FFF , 818px 1573px #FFF , 191px 45px #FFF , 519px 1277px #FFF , 629px 758px #FFF , 299px 1064px #FFF , 1980px 742px #FFF , 625px 1771px #FFF , 1470px 3px #FFF , 1971px 1160px #FFF , 1476px 1400px #FFF , 1784px 486px #FFF , 271px 185px #FFF , 358px 1388px #FFF , 853px 1062px #FFF , 1799px 1672px #FFF , 1941px 768px #FFF , 177px 1607px #FFF , 1305px 1763px #FFF , 84px 1245px #FFF , 792px 1201px #FFF , 1646px 159px #FFF , 468px 1095px #FFF , 1136px 1424px #FFF , 179px 327px #FFF , 1966px 544px #FFF , 859px 1323px #FFF , 274px 1264px #FFF , 595px 777px #FFF , 556px 1702px #FFF , 535px 810px #FFF , 1534px 856px #FFF , 226px 468px #FFF , 1271px 441px #FFF , 1014px 1557px #FFF , 206px 1061px #FFF , 1090px 1903px #FFF , 1802px 976px #FFF , 719px 412px #FFF , 248px 591px #FFF , 5px 1062px #FFF , 1235px 1962px #FFF , 1197px 1064px #FFF , 241px 340px #FFF , 303px 495px #FFF , 1662px 33px #FFF , 1819px 525px #FFF , 961px 256px #FFF , 287px 263px #FFF , 1138px 1032px #FFF , 962px 1596px #FFF , 420px 614px #FFF , 1665px 1713px #FFF , 921px 1184px #FFF , 52px 1547px #FFF , 935px 177px #FFF , 1638px 1884px #FFF , 881px 957px #FFF , 979px 893px #FFF , 1307px 1199px #FFF , 696px 190px #FFF , 1371px 781px #FFF , 79px 1799px #FFF , 146px 1015px #FFF , 1101px 1025px #FFF , 955px 1200px #FFF , 1267px 1241px #FFF , 73px 7px #FFF , 546px 16px #FFF , 1680px 1570px #FFF , 719px 1523px #FFF , 1391px 229px #FFF , 1865px 60px #FFF , 1265px 1511px #FFF , 1293px 141px #FFF , 390px 168px #FFF , 329px 504px #FFF , 1102px 801px #FFF , 1759px 810px #FFF , 1536px 128px #FFF , 38px 1566px #FFF , 1043px 721px #FFF , 1439px 174px #FFF , 1427px 285px #FFF , 507px 922px #FFF , 1136px 860px #FFF , 1838px 869px #FFF , 1606px 1052px #FFF , 919px 1024px #FFF , 748px 935px #FFF , 1110px 769px #FFF , 1625px 206px #FFF , 46px 1454px #FFF , 1353px 441px #FFF , 1462px 215px #FFF , 404px 681px #FFF , 580px 777px #FFF , 1376px 694px #FFF , 305px 374px #FFF , 648px 462px #FFF , 216px 97px #FFF , 944px 1715px #FFF , 1384px 665px #FFF , 1886px 1883px #FFF , 1731px 1610px #FFF , 939px 576px #FFF , 1401px 1390px #FFF , 793px 1596px #FFF , 1616px 1966px #FFF , 547px 1259px #FFF , 1042px 98px #FFF , 754px 646px #FFF , 506px 508px #FFF , 1211px 230px #FFF , 782px 225px #FFF , 596px 1652px #FFF , 199px 1390px #FFF , 1199px 1613px #FFF , 1386px 971px #FFF , 798px 217px #FFF , 2px 1951px #FFF , 910px 801px #FFF , 60px 1194px #FFF , 1847px 1370px #FFF , 252px 1901px #FFF , 1293px 654px #FFF , 1398px 1232px #FFF , 864px 1873px #FFF , 1568px 896px #FFF , 1744px 1836px #FFF , 584px 1044px #FFF , 1565px 896px #FFF , 649px 676px #FFF , 1908px 459px #FFF , 1585px 24px #FFF , 1206px 295px #FFF , 143px 1318px #FFF , 1987px 1398px #FFF , 1186px 675px #FFF , 368px 1906px #FFF , 1553px 1631px #FFF , 1646px 1889px #FFF , 1690px 416px #FFF , 995px 597px #FFF , 220px 1893px #FFF , 204px 776px #FFF , 1548px 1490px #FFF , 737px 1459px #FFF , 1748px 1472px #FFF , 455px 632px #FFF , 559px 299px #FFF , 341px 1725px #FFF , 668px 1434px #FFF , 1732px 1773px #FFF , 1773px 354px #FFF , 1014px 1758px #FFF , 841px 1012px #FFF , 134px 917px #FFF , 37px 393px #FFF , 499px 1240px #FFF , 672px 1738px #FFF , 235px 113px #FFF , 1783px 220px #FFF , 1490px 1111px #FFF , 195px 1198px #FFF , 373px 1919px #FFF , 1607px 449px #FFF , 1430px 1222px #FFF , 620px 856px #FFF , 1881px 1692px #FFF , 125px 152px #FFF , 575px 115px #FFF , 181px 1533px #FFF , 595px 1003px #FFF , 1354px 1748px #FFF , 801px 12px #FFF , 1880px 1002px #FFF , 1197px 272px #FFF , 993px 238px #FFF , 1848px 448px #FFF , 515px 1484px #FFF , 567px 1540px #FFF , 1396px 1191px #FFF , 294px 1492px #FFF , 943px 1752px #FFF , 136px 1632px #FFF , 1945px 656px #FFF , 739px 629px #FFF , 812px 1664px #FFF , 1905px 904px #FFF , 310px 1972px #FFF , 224px 483px #FFF , 1770px 944px #FFF , 1009px 354px #FFF , 1062px 878px #FFF , 275px 1499px #FFF , 1487px 1196px #FFF , 1436px 1816px #FFF , 1923px 1408px #FFF , 1708px 976px #FFF , 1157px 1935px #FFF , 1166px 1835px #FFF , 928px 288px #FFF , 957px 595px #FFF , 1124px 138px #FFF , 1249px 1692px #FFF , 1247px 1478px #FFF , 528px 758px #FFF , 1000px 1824px #FFF , 1660px 286px #FFF , 1679px 1991px #FFF , 1532px 820px #FFF , 716px 1266px #FFF , 157px 1665px #FFF , 1409px 1997px #FFF , 569px 339px #FFF , 854px 978px #FFF , 1444px 1124px #FFF , 319px 1568px #FFF , 478px 37px #FFF , 1452px 1924px #FFF , 269px 1068px #FFF , 20px 338px #FFF , 1068px 1579px #FFF , 488px 1471px #FFF , 1584px 1493px #FFF , 344px 1109px #FFF , 1256px 861px #FFF , 1053px 1751px #FFF , 363px 1889px #FFF , 1892px 64px #FFF , 1021px 1923px #FFF , 1066px 215px #FFF , 684px 896px #FFF , 732px 672px #FFF , 380px 842px #FFF , 537px 1714px #FFF , 984px 1890px #FFF , 115px 1739px #FFF , 1183px 1977px #FFF , 419px 1366px #FFF , 1152px 1061px #FFF , 1628px 615px #FFF , 1297px 694px #FFF , 149px 842px #FFF , 948px 1623px #FFF , 1671px 1609px #FFF , 770px 1884px #FFF , 1393px 1117px #FFF , 346px 1537px #FFF , 597px 700px #FFF , 1283px 1882px #FFF , 1789px 382px #FFF , 190px 505px #FFF , 1002px 662px #FFF , 285px 1640px #FFF , 911px 1974px #FFF , 442px 1536px #FFF , 1631px 339px #FFF , 1222px 16px #FFF , 1820px 1888px #FFF , 356px 1792px #FFF , 835px 1845px #FFF , 97px 456px #FFF , 1909px 688px #FFF , 1850px 1163px #FFF , 692px 876px #FFF , 1777px 1763px #FFF , 229px 919px #FFF , 873px 1473px #FFF , 374px 1194px #FFF , 1233px 1686px #FFF , 647px 23px #FFF , 1580px 1326px #FFF , 935px 891px #FFF , 829px 769px #FFF , 1808px 934px #FFF , 643px 1536px #FFF , 865px 1362px #FFF , 410px 505px #FFF , 550px 1494px #FFF , 532px 43px #FFF , 162px 404px #FFF , 1128px 492px #FFF , 1185px 29px #FFF , 1432px 123px #FFF , 360px 836px #FFF , 1030px 1508px #FFF , 1080px 559px #FFF , 1521px 993px #FFF , 1409px 931px #FFF , 1988px 46px #FFF , 553px 1090px #FFF , 1326px 584px #FFF , 432px 723px #FFF , 1900px 889px #FFF , 1366px 1328px #FFF , 1176px 1977px #FFF , 712px 627px #FFF , 865px 1581px #FFF , 1630px 288px #FFF , 350px 889px #FFF , 1520px 1702px #FFF , 574px 61px #FFF , 770px 641px #FFF , 190px 1352px #FFF , 731px 1718px #FFF , 1775px 853px #FFF , 318px 872px #FFF , 1320px 935px #FFF , 1731px 709px #FFF , 462px 1887px #FFF , 1986px 1379px #FFF , 1257px 903px #FFF , 1163px 947px #FFF , 490px 925px #FFF , 1595px 1274px #FFF , 1186px 1462px #FFF , 362px 76px #FFF , 826px 1410px #FFF , 575px 1099px #FFF , 1015px 1884px #FFF , 1670px 1761px #FFF , 1793px 812px #FFF , 427px 1834px #FFF , 221px 1176px #FFF , 1990px 499px #FFF , 892px 1983px #FFF , 1046px 1126px #FFF , 1402px 808px #FFF , 1167px 807px #FFF , 1185px 520px #FFF , 1468px 211px #FFF , 1564px 1238px #FFF , 589px 315px #FFF , 390px 1706px #FFF , 533px 1661px #FFF , 916px 1864px #FFF , 1154px 1334px #FFF , 1117px 15px #FFF , 1445px 189px #FFF , 864px 1949px #FFF , 205px 1495px #FFF , 1695px 1847px #FFF , 1991px 1460px #FFF , 1156px 1000px #FFF , 1767px 1367px #FFF , 875px 97px #FFF , 1619px 1770px #FFF , 1104px 1170px #FFF , 1781px 1022px #FFF , 835px 413px #FFF , 1104px 1103px #FFF , 550px 1919px #FFF , 1476px 1823px #FFF , 1109px 639px #FFF , 1642px 220px #FFF , 834px 517px #FFF , 1621px 980px #FFF , 690px 1528px #FFF , 1654px 591px #FFF , 1976px 1665px #FFF , 582px 1510px #FFF , 1019px 991px #FFF , 1525px 1038px #FFF , 713px 206px #FFF , 1252px 572px #FFF , 483px 1002px #FFF , 718px 1918px #FFF , 1443px 324px #FFF , 51px 1363px #FFF , 468px 1416px #FFF , 1809px 764px #FFF , 1789px 411px #FFF , 642px 1761px #FFF , 667px 1725px #FFF , 272px 1755px #FFF , 1513px 894px #FFF , 1098px 43px #FFF , 936px 986px #FFF , 1414px 601px #FFF , 411px 46px #FFF , 516px 223px #FFF , 1891px 700px #FFF , 646px 4px #FFF , 53px 1050px #FFF , 1799px 795px #FFF , 157px 25px #FFF , 1951px 1741px #FFF , 271px 528px #FFF , 33px 259px #FFF , 1443px 1775px #FFF , 1604px 942px #FFF , 1750px 1561px #FFF , 702px 1571px #FFF , 104px 1411px #FFF , 1554px 1278px #FFF , 1527px 451px #FFF , 1647px 216px #FFF , 1152px 437px #FFF , 614px 1697px #FFF , 429px 1081px #FFF , 1491px 1282px #FFF , 560px 364px #FFF , 1057px 1762px #FFF , 1523px 2000px #FFF , 794px 1445px #FFF , 981px 434px #FFF , 1124px 779px #FFF , 104px 617px #FFF , 1607px 153px #FFF , 963px 1244px #FFF , 1880px 639px #FFF , 194px 1171px #FFF , 1309px 1201px #FFF , 1517px 1575px #FFF , 987px 382px #FFF , 347px 500px #FFF , 888px 1077px #FFF , 1272px 1967px #FFF , 1764px 71px #FFF , 705px 366px #FFF , 1451px 918px #FFF , 1945px 835px #FFF , 786px 1282px #FFF , 393px 8px #FFF , 764px 1209px #FFF , 115px 1132px #FFF , 712px 998px #FFF , 1840px 1657px #FFF , 342px 792px #FFF , 488px 866px #FFF , 1908px 1538px #FFF , 678px 1972px #FFF , 1672px 446px #FFF , 1617px 969px #FFF , 1175px 1414px #FFF , 778px 1385px #FFF , 986px 1722px #FFF , 1926px 677px #FFF , 132px 687px #FFF , 643px 1254px #FFF , 514px 22px #FFF , 653px 1464px #FFF , 163px 857px #FFF , 1765px 1577px #FFF , 491px 1195px #FFF , 109px 792px #FFF , 359px 1565px #FFF , 1999px 1335px #FFF , 720px 74px #FFF , 1310px 1914px #FFF , 817px 1085px #FFF , 938px 297px #FFF , 1798px 245px #FFF , 914px 1725px #FFF , 589px 710px #FFF , 578px 53px #FFF , 128px 791px #FFF , 930px 483px #FFF , 189px 987px #FFF , 882px 1877px #FFF , 61px 426px #FFF , 693px 317px #FFF , 327px 930px #FFF , 578px 19px #FFF , 610px 867px #FFF , 1777px 404px #FFF , 877px 422px #FFF , 1759px 1565px #FFF , 382px 1777px #FFF , 769px 1151px #FFF , 1147px 1418px #FFF; +} + +@keyframes animation-stars { + from { + transform: translateY(0px); + } + to { + transform: translateY(-2000px); + } +} + +div.odb-dt-snow-dynamic-effect { + position: absolute; + z-index: -200; + height: 100vh; + width: 100% !important; + overflow: hidden; + padding:0; + margin:0px; +} + +div.odb-dt-snow-dynamic-effect div.snow, div.odb-dt-snow-dynamic-effect div.snow:before, div.odb-dt-snow-dynamic-effect div.snow:after { + position: absolute; + top: -600px; + left: 0; + bottom: 0; + right: 0; + background-image: radial-gradient(4px 4px at 421px 141px, rgb(255, 255, 255) 50%, rgba(0, 0, 0, 0)), radial-gradient(3px 3px at 489px 152px, rgb(255, 255, 255) 50%, rgba(0, 0, 0, 0)), radial-gradient(6px 6px at 327px 403px, rgba(255, 255, 255, 0.9) 50%, rgba(0, 0, 0, 0)), radial-gradient(6px 6px at 499px 194px, rgba(255, 255, 255, 0.9) 50%, rgba(0, 0, 0, 0)), radial-gradient(3px 3px at 288px 315px, rgba(255, 255, 255, 0.9) 50%, rgba(0, 0, 0, 0)); + background-size: 600px 600px; + animation: sc-snow-animate 20s linear infinite; + content: ""; + opacity: 0.5; +} + +div.odb-dt-snow-dynamic-effect div.snow:after { + margin-left: -200px; + opacity: 0.4; + animation-duration: 40s; + animation-direction: reverse; + filter: blur(3px); +} + +div.odb-dt-snow-dynamic-effect div.snow:before { + animation-duration: 60s; + animation-direction: reverse; + margin-left: -300px; + opacity: 0.65; + filter: blur(1.5px); +} + +@keyframes sc-snow-animate { + to { + transform: translateY(600px); + } +} + +div.odb-dt-rain-dynamic-effect { + position: absolute; + z-index: -200; + height: 100vh; + width: 100% !important; + overflow: hidden; + padding:0; + margin:0px; +} + +div.odb-dt-rain-dynamic-effect svg.rain__drop { + animation-delay: calc(var(--d) * 1s); + animation-duration: calc(var(--a) * 15s); + animation-iteration-count: infinite; + animation-name: rd-drop; + animation-timing-function: linear; + height: 30px; + left: calc(var(--x) * 1%); + position: absolute; + top: calc((var(--y) + 50) * -1px); +} + +div.odb-dt-rain-dynamic-effect svg.rain__drop path { + fill: #a1c6cc; + opacity: var(--o); + transform: scaleY(calc(var(--s) * 1.5)); +} + +@-webkit-keyframes rd-drop { + 90% { + opacity: 1; + } + 100% { + opacity: 0; + transform: translateY(100vh); + } +} +@keyframes rd-drop { + 90% { + opacity: 1; + } + 100% { + opacity: 0; + transform: translateY(100vh); + } +} + +div.odb-dt-random-circle-dynamic-effect { + position: absolute; + z-index: -200; + height: 100vh; + width: 100% !important; + overflow: hidden; + padding:0; + margin:0px; +} + +div.odb-lt-random-circle-dynamic-effect { + position: absolute; + z-index: -200; + height: 100vh; + width: 100% !important; + overflow: hidden; + padding:0; + margin:0px; +} +div.odb-lt-wave-effect { + position: absolute; + z-index: -200; + height: 100vh; + width: 100% !important; + overflow: hidden; + padding:0; + margin:0px; +} +div.odb-lt-wave-effect div.ocean{ + position:absolute; + width:100%; + min-height:100%; + opacity: 20%; + background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0, rgb(0,150,150)), + color-stop(0.50, rgb(0,150,255)) + ); +} +.wave-0723{ + background:#a8bfca; + display:inline-block; + height:90%; + width:10px; + position:absolute; + -webkit-animation-name: dostuff; + -webkit-animation-duration: 10s; + -webkit-animation-iteration-count: infinite; + -webkit-transition-timing-function: ease-in-out; +} +@-webkit-keyframes dostuff{ + 0%{ + height:90%; + } + 50%{ + height:80%; + } + 100%{ + height:90%; + } +} \ No newline at end of file diff --git a/Material/Tutorial2_Lösungen.ipynb b/Material/Tutorial2_Lösungen.ipynb new file mode 100644 index 0000000..010627a --- /dev/null +++ b/Material/Tutorial2_Lösungen.ipynb @@ -0,0 +1,532 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "1486c477-e52f-492a-a699-4f6668f43826", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "
\n", + "
\n", + "

Lösungen Tutorial 2

\n", + "
\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "89c3ed2f-6f9b-4d5c-adeb-482b4fd83b2b", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "### Aufgabe \n", + "\n", + "*3 Punkte*\n", + "\n", + "Schreibe eine Funktion `sum_up` mit Eingabeparameter `n`, welcher die Zahlen von `1...n` aufsummiert.\n", + "\n", + "Nutze dafür einen `for-loop`.\n", + "\n", + "**Beispiel**:\n", + "\n", + "$$n = 5$$ \n", + "$$sum\\_up(5) \\rightarrow 1 \\rightarrow 1 + 2 = 3 \\rightarrow 3 + 3 = 6 \\rightarrow 6 + 4 = 10 \\rightarrow 10 + 5 = 15$$\n", + "\n", + "Hinweis: die Funktion `range()` zählt standardmässig von `0...n-1`. Schauen Sie sich gerne dazu die offizielle Dokumentation an [PEP 204](https://peps.python.org/pep-0204/#list-ranges)." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "d6de90ca-1db9-4c59-a5a4-42016370cb35", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "subslide" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "15" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def sum_up(n: int) -> int:\n", + " count = 0\n", + " for i in range(1,n+1):\n", + " count += i\n", + " return count\n", + "\n", + "sum_up(5)" + ] + }, + { + "cell_type": "markdown", + "id": "7a9de268-09e4-45e5-8aa9-db5ae79e9540", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "subslide" + }, + "tags": [] + }, + "source": [ + "Es gibt immer einen besseren weg.\n", + "\n", + "Nach Gauß:\n", + "\n", + "$$\\sum_{k=1}^n k = 1 + 2 + 3 + \\dots + n = \\frac{n(n+1)}{2}$$" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "fd8eea02-c356-4906-8db8-ae4cdaf4f97c", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "15" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# nach Gauß\n", + "def sum_up(n: int) -> int:\n", + " return int(n*(n+1)/2)\n", + "\n", + "sum_up(5)" + ] + }, + { + "cell_type": "markdown", + "id": "ea73e1ec-7b2a-4293-b269-03b8054aaa54", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "### Aufgabe\n", + "\n", + "*2 Punkte*\n", + "\n", + "Ihnen ist das Dictionary `dict2` gegeben. Ändern Sie jeden Wert in dem Dictionary nach der Formel $f(x) = x^3-1$ mittels `for-loop`.\n", + "\n", + "Tipp: Lassen Sie sich nicht von den Schlüsseln verwirren." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2a3e9cac-49ee-49f0-88da-a75e9611f1d8", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'a': 56, 5: 12, 'python': 9, 3.14: 1.141414}" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Vorgegeben\n", + "dict2 = {\"a\": 56, 5: 12, \"python\": 9, 3.14: 1.141414}\n", + "dict2" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "26aa9f7b-b5e8-4f8f-a0d0-b796b253ad71", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "subslide" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'a': 175615, 5: 1727, 'python': 728, 3.14: 0.48706374396146557}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Kurze Lösung mittels Dictionary Comprehension\n", + "dict2 = {key: value**3-1 for key, value in dict2.items()}\n", + "dict2" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "4f625aaf-a04b-4c08-b18b-915b61c0145c", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'a': 175615, 5: 1727, 'python': 728, 3.14: 0.48706374396146557}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Lange Übersichtliche Lösung\n", + "for key, value in dict2.items():\n", + " dict2[key] = dict2[key]**3 - 1\n", + "dict2" + ] + }, + { + "cell_type": "markdown", + "id": "c4a7b4a9-7cbd-4127-8832-fdd7c3541409", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "### Zusatzaufgabe \n", + "\n", + "*Keine Punkte*\n", + "\n", + "Erstellen Sie eine List mittels List Comprehension, welche die Zahlen `1...6` auf deren kubische Zahl `1...216` also der Funktion $f(x) = x^3$ abbildet." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f8e84221-f7da-474a-aa14-bcf7d1d3a201", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 8, 27, 64, 125, 216]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cubics = [n**3 for n in range(1,7)]\n", + "cubics" + ] + }, + { + "cell_type": "markdown", + "id": "3cdbb5b7-f828-48eb-ba49-09d5ae68c2d7", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "### Aufgabe\n", + "\n", + "*2 Punkte*\n", + "\n", + "Erstellen und Öffnen sie eine Datei `testfile.txt` mit der `open` Funktion, nutzen Sie dafür das `with`-Statement.\n", + "\n", + "Schreiben Sie in diese Datei 100 mal den String `\"Python\\n\"`." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "90875b44-8209-498a-ad38-063772588711", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "with open('testfile.txt', 'w') as f:\n", + " for _ in range(100):\n", + " f.write(\"Python\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "c69ac8e9-34ef-413a-a39f-7db6a830cde3", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "### Aufgabe\n", + "\n", + "*2 Punkte*\n", + "\n", + "Öffnen Sie die zuvor erstellte Datei `testfile.txt` im Lesemodus und weißen Sie den Inhalt der `.readlines()` Funktion der Variabeln `lines` zu. " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "a8395ec5-59dc-43e3-a59d-9dea7cf1f21d", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Anzahl der gelesenen Zeilen: 100\n" + ] + } + ], + "source": [ + "lines = None # vorgegeben\n", + "with open('testfile.txt', 'r') as f:\n", + " lines = f.readlines()\n", + "\n", + "print(\"Anzahl der gelesenen Zeilen:\", len(lines))" + ] + }, + { + "cell_type": "markdown", + "id": "00561f0d-9d9f-45bd-bf1f-824f04edf795", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "### Aufgabe\n", + "\n", + "*3 Punkte*\n", + "\n", + "Importiere Python Built-In Library `random` und rufe zuerst aus dem Modul die Funktion `seed` auf mit dem Eingabewert `42`, und weiße danach der Variable `rand` den Wert des Funktionsaufrufes von `randint(1,100)` zu. " + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "63c44277-581a-426c-8e2d-ed911688ca91", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "82" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rand = None # vorgegeben\n", + "import random\n", + "random.seed(42)\n", + "rand = random.randint(1,100)\n", + "rand" + ] + }, + { + "cell_type": "markdown", + "id": "78ec5791-46b7-4693-b276-7f5e73a18eb7", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "### Aufgabe\n", + "\n", + "*1 Punkt*\n", + "\n", + "Importieren Sie die Built-In Library `datetime` als `dt`." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "e3f4fe99-5980-4c2a-be4e-ae777f4bbb3d", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2024-11-08 11:58:43.750641\n" + ] + } + ], + "source": [ + "import datetime as dt\n", + "print(dt.datetime.now())" + ] + }, + { + "cell_type": "markdown", + "id": "d1bf6ca3-4f96-456e-a8e9-34d9fd081c5b", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "### Aufgabe\n", + "\n", + "*2 Punkte*\n", + "\n", + "Importieren Sie die Funktion `sqrt` aus dem Built-In Modul `math`.\n", + "Berechnen Sie $\\sqrt4$. Speichern Sie das Ergebnis in der variablen `s4`." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "eed3fc0f-67c1-43d5-ac2f-f6b7646aecdd", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "2.0" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from math import sqrt\n", + "s4 = sqrt(4)\n", + "s4" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Material/V4.ipynb b/Material/V4.ipynb new file mode 100644 index 0000000..a877ec3 --- /dev/null +++ b/Material/V4.ipynb @@ -0,0 +1,637 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "80fd796e-f42e-4940-89ae-e7359be4d10a", + "metadata": {}, + "source": [ + "# 4 Vorlesung" + ] + }, + { + "cell_type": "markdown", + "id": "cb2fcdfe-257a-4736-b9c2-5fa17d63fd1b", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Generatoren\n", + "```python\n", + "def ():\n", + " # do something\n", + " yield \n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "0ea7c66c-439c-4a3b-a154-3449c2a799a1", + "metadata": {}, + "source": [ + "### Endliche Generatoren" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "d5465edd-a13d-4fa0-a805-30c35a384d54", + "metadata": {}, + "outputs": [], + "source": [ + "# Matrikelnummer generator\n", + "import random \n", + "def mat_nr_gen(anzahl: int) -> float:\n", + " for _ in range(anzahl):\n", + " yield random.randint(500_000, 700_000) # Generator weil yield" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "48109f19-47d2-45a1-bd03-9eccb4d25372", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sem_3 = mat_nr_gen(5) # generator erstellen\n", + "sem_3" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "413bbbf6-87c8-41ff-8680-a70e8456d865", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "559540" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "next(sem_3) # Nächsten Wert des Generators" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "14a1220d-ae0c-428b-bd51-564e66e55854", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "606586" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "next(sem_3) # ..." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "af75146c-e727-41e8-b496-695b93a68a56", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "503048\n", + "648312\n", + "629536\n", + "556597\n", + "512158\n" + ] + } + ], + "source": [ + "for _ in range(5):\n", + " print(next(sem_3)) # 5 mal den generator aufrufen" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "4691aa5c-0e3d-4dff-93c1-835a805e20e9", + "metadata": {}, + "outputs": [ + { + "ename": "StopIteration", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[19], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;43mnext\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43msem_3\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[0;31mStopIteration\u001b[0m: " + ] + } + ], + "source": [ + "next(sem_3) # Generator hat keine Werte mehr -> Fehler" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "6790f776-4201-403f-b95d-d789a4fe3a6f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "591325\n", + "582340\n", + "622867\n", + "653166\n", + "531169\n", + "538806\n", + "571659\n" + ] + } + ], + "source": [ + "for mat_nr in mat_nr_gen(7): # For loop übernimmt die komplette Arbeit\n", + " print(mat_nr)" + ] + }, + { + "cell_type": "markdown", + "id": "4cfbb732-c412-4ded-8f33-75a9917b0df1", + "metadata": {}, + "source": [ + "### Unendliche Generatoren" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "b2b3c678-a775-4213-9a73-4d3aa48eff5e", + "metadata": {}, + "outputs": [], + "source": [ + "# Seriennummer generator\n", + "def serial_nr_gen() -> int:\n", + " while True: # \"Führe unendlich of aus\"\n", + " yield random.randint(1000, 2000) # Generator weil yield" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "e6ba3c92-465c-487d-a936-a155ad713784", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1940\n", + "1748\n", + "1342\n", + "1463\n", + "1100\n", + "1748\n", + "1158\n", + "1577\n", + "1321\n", + "1949\n" + ] + } + ], + "source": [ + "ser_gen = serial_nr_gen() # Generator erstellen\n", + "for _ in range(10):\n", + " print(next(ser_gen)) # 10 mal den generator abfragen" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "c015d2c3-238b-454a-b75e-f81a19f89a79", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1281" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "next(ser_gen) # Diesmal kein Fehler da Generator kein Ende hat" + ] + }, + { + "cell_type": "markdown", + "id": "cd8ed607-c0e0-481c-aaa7-cf07e8c97051", + "metadata": {}, + "source": [ + "## Type Hints" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "9f564549-70d7-4538-a3fd-7158514fa0d4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{2.0: 2.0, 'HI': 'HI', 9: 9, True: True}\n", + "0.0 \n" + ] + } + ], + "source": [ + "# Beispielfunktion\n", + "\n", + "# Type hints zeigen dem Programmierer welche Datentypen erwartet werden\n", + "def useless(p1: int, p2: float, p3: bool, p4: str) -> dict: \n", + " return {p1: p1, p2: p2, p3: p3, p4: p4}\n", + "\n", + "print(useless(2.0, \"HI\", 9, True)) # Aufruf mit \"Falschen\" Datentypen\n", + "\n", + "# Beispielvariablen:\n", + "zahl: int = 0.0 # Zahl ist ein Float\n", + "print(zahl, type(zahl))" + ] + }, + { + "cell_type": "markdown", + "id": "2572fb15-de4f-4be7-809b-955d26895d84", + "metadata": {}, + "source": [ + "## Dataclasses\n", + "\n", + "Auto Dataclass\n", + "\n", + "|Attribut|Wert|\n", + "|-|-|\n", + "|Marke|VW|\n", + "|Fahrzeugtyp|Limousine|\n", + "|Seriennummer||" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "feb80166-b58a-46bf-94b0-f26142d6131f", + "metadata": {}, + "outputs": [], + "source": [ + "from dataclasses import dataclass" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "b9c6ba77-1d59-4058-b18c-601989d9b8db", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataclass # Decorator" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "81e41f92-8ce6-40de-9319-629cb69c73e9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Auto(marke='VW', model='Limousine', serial_nr=1146)" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ser_gen = serial_nr_gen()\n", + "\n", + "# Diese Syntax einfach merken\n", + "@dataclass\n", + "class Auto:\n", + " marke: str # 1 Attribut\n", + " model: str # 2 Attribut\n", + " serial_nr: int = next(ser_gen) # 3 Attribut mit Standardwert\n", + "\n", + "Auto(\"VW\", \"Limousine\") # Erstellt eine Auto Dataclass " + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "f2e0e50e-f1f9-4ead-8530-0aeb40989581", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Auto(marke='Porsche', model='SUV', serial_nr=1146)" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Auto(model=\"SUV\", marke=\"Porsche\") # Attribute können explizit definiert werden" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "e5cb5618-50a9-4e38-a0b4-7e3e5e4c2295", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Auto(marke='Porsche', model='SUV', serial_nr=5678)" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Auto(model=\"SUV\", serial_nr=5678, marke=\"Porsche\") # Standardwerte lassen sich überschreiben " + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "655cbee0-88c0-4f60-97c5-4ef475d59f0b", + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "Auto.__init__() got an unexpected keyword argument 'reifenzahl'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[37], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mAuto\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mSUV\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mserial_nr\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m5678\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmarke\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mPorsche\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreifenzahl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m5\u001b[39;49m\u001b[43m)\u001b[49m\n", + "\u001b[0;31mTypeError\u001b[0m: Auto.__init__() got an unexpected keyword argument 'reifenzahl'" + ] + } + ], + "source": [ + "Auto(model=\"SUV\", serial_nr=5678, marke=\"Porsche\", reifenzahl=5) # Nicht bekanntes Attribut wirft Fehler" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "22c0625c-4e7d-46aa-a711-5cc2bb759427", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'marke': 'Porsche', 'model': 'SUV', 'serial_nr': 12766}" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Beispiel als Dict\n", + "vw = {\n", + " \"marke\": \"Porsche\",\n", + " \"model\": \"SUV\",\n", + " \"serial_nr\": 12766\n", + "}\n", + "\n", + "vw" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "77668ca0-719d-48b8-954f-b2f7becdb318", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'marke': 'Porsche', 'model': 'SUV', 'serial_nr': 12766, 'reifenzahl': 7}" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Dict wirft keinen Fehler\n", + "vw[\"reifenzahl\"] = 7\n", + "vw" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "deb76203-f99c-45d1-b1f6-8395dc22ccab", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Porsche'" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vw[\"marke\"] # Zugriff auf Wert im dict" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "b3397bbe-0925-4189-b079-bef46a3dff95", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Auto(marke='Porsche', model='SUV', serial_nr=5678)" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "porsche = Auto(model=\"SUV\", serial_nr=5678, marke=\"Porsche\")\n", + "porsche" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "4a244554-957a-423d-8561-765aad99475a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'SUV'" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "porsche.model # Zugriff auf Attribut in der Dataclass" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "3c02985e-e7b7-4dd6-aad5-02a3bd3e5312", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5678" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "porsche.serial_nr # same" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "57ccfffc-e89b-4c51-bc6d-7bf2ca16720f", + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'mark'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[44], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mvw\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmark\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\n", + "\u001b[0;31mKeyError\u001b[0m: 'mark'" + ] + } + ], + "source": [ + "vw[\"mark\"] # KeyError wenn schlüssel nicht vorhanden im dict" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "8e508117-c1b3-4bf1-b9ae-a73b7bafd801", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Auto(marke=True, model=2.14, serial_nr=1146)" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Type Hints sind Type Hints und hindern nicht daran \"Falsche\" Datentypen an die Dataclasss zu vergeben \n", + "Auto(model=2.14, marke=True) " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Material/testfile.txt b/Material/testfile.txt new file mode 100644 index 0000000..28bf81b --- /dev/null +++ b/Material/testfile.txt @@ -0,0 +1,100 @@ +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python +Python diff --git a/Material/wise_24_25/lernmaterial/1.Tutorial_1.ipynb b/Material/wise_24_25/lernmaterial/1.Tutorial_1.ipynb new file mode 100644 index 0000000..ed2e9dd --- /dev/null +++ b/Material/wise_24_25/lernmaterial/1.Tutorial_1.ipynb @@ -0,0 +1,2044 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "92fe3a94-61b2-47f9-9485-02aa8b103d5c", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-e72aa2f84c4b1cb7", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# 1. Programmierübung: Python Tutorial\n", + "\n", + "
\n", + "
\n", + " Willkommen zur ersten Programmierübung Einführung in Python 3.\n", + "
\n", + " \n", + "
\n", + " \n", + "Python ist eine universelle Programmiersprache, die aufgrund ihrer Einfachheit sehr leicht zu lernen und zu bedienen ist. Die Funktionalität kann durch den Import von Bibliotheken erweitert werden. Im Folgenden werden wir Ihnen zeigen, wie man hier im Jupyter Notebook Python Code ausführen kann. Die grundlegenden Konzepte und Strukturen in Python werden mit Hilfe von externen Quellen gezeigt. Die Übungsaufgaben dienen zum Testen und der Hands-on-Praxis des gelernten Wissens. \n", + "\n", + "In diesem Jupyter Notebook werden die grundlegende Funktionen und Konzepte in Python vorgestellt. Dazu wird es kleine Programmierübungen um das gelernte Wissen in Beispielen anzuwenden. (Objekt Orientierte Programmierung werden wir in diesem Kurs nicht behandeln!)\n", + "\n", + "Das Jupyter Notebook ist in Zellen unterteilt, die durch Boxen gekennzeichnet sind, die einzeln ausgeführt werden können (entweder über `Shift + Enter` oder den `Run`-Knopf). Sie können auch alle Zellen im Notebook ausführen über `Kernel > Restart & Run All` oder dem \"Vorspulen\"-Zeichen.\n", + "\n", + "Bitte beachten Sie, dass alle Zellen im Notebook ein gemeinsamen Workspace nutzen. Das bedeutet, dass Bibliotheken nur einmal importiert werden müssen und dann innerhalb des Notebooks genutzt werden können. Es können jedoch auch Variablen überschrieben werden, wenn diese nicht richtig gekapselt werden (z.B. über Funktionen).\n", + "\n", + "Viel Spaß und Erfolg!\n", + "\n", + "Es gibt _sehr_ viele weitere Python-Tutorials online, z.B. auf [Youtube](https://youtu.be/kqtD5dpn9C8), mit denen Sie die benötigten Grundlagen für Python lernen können.\n", + "\n", + "Wenn Sie Fragen oder Verbesserungsvorschläge zum Inhalt oder Struktur der Notebooks haben, dann können Sie eine E-Mail an Phil Keier([p.keier@hbk-bs.de](mailto:p.keier@hbk-bs.de?subject=[SigSys]%20Feedback%20Programmierübung&)) oder Martin Le ([le@tu-bs.de](mailto:martin.le@tu-bs.de?subject=[SigSys]%20Feedback%20Programmierübung&)) schreiben.\n", + "\n", + "Link zu einem Python Spickzettel: [hier](https://s3.amazonaws.com/assets.datacamp.com/blog_assets/PythonForDataScience.pdf)\n", + "\n", + "Der Großteil des Python-Tutorials stammt aus der Veranstaltung _Deep Learning Lab_ und von [www.python-kurs.eu](https://www.python-kurs.eu/python3_kurs.php) und wurden für _Signale und Systeme_, sowie _Einführung in die Programmierung für Nicht Informatiker_ angepasst.\n", + "\n", + "---\n" + ] + }, + { + "cell_type": "markdown", + "id": "6ac5a9e3-7190-4db6-859b-3cb1511fe29f", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-c8293a61ad8fb19c", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Printing\n", + "\n", + "Für viele Anwendungsfälle ist es wichtig, dass der Computer mit uns als Mensch kommunizieren kann. Zu diesem Zweck lernen wir zuerst wie wir eine Ausgabe erzeugen können. Hierzu verwenden wir die Funktion `print()`.\n", + "\n", + "[print()](https://www.w3schools.com/python/ref_func_print.asp) ist eine BuiltIn Funktion, zu diesen später mehr. Es soll aber gesagt sein, dass keinerlei anstrengungen notwendig sind um die Print-Funktion zu verwenden, da Python sie von Haus aus kennt.\n", + "\n", + "## Hello World\n", + "\n", + "Schauen wir uns nun folgend ein einfaches Programm an:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "3733ea3b-12b5-4c1c-9b03-0f1c397babfc", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-5f71f94cf9d603e2", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello World\n" + ] + } + ], + "source": [ + "print(\"Hello World\")" + ] + }, + { + "cell_type": "markdown", + "id": "708d34f1-a479-4277-90e7-14d67a8c688a", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-d49c16a44b1d3984", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Der Teil in den Klammern ist der Wert den wir ausgeben wollen in diesem Fall eine einfache Zeichenkette (auch dazu später mehr).\n", + "\n", + "Damit zu ersten **Aufgabe**: Geben Sie den Text `Hallo Python` aus. *1 Punkt*" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "88b8d4db-6f4c-411c-b8ad-d2d6ca0b427c", + "metadata": { + "editable": true, + "nbgrader": { + "grade": true, + "grade_id": "cell-cd36c0330024bfe5", + "locked": false, + "points": 1, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hallo Python\n" + ] + } + ], + "source": [ + "# BEGIN SOLUTION\n", + "print(\"Hallo Python\")\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "markdown", + "id": "ad8d06df-5d3d-4203-b17c-227a663c8e7b", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-95b07b67b0ede718", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Datentypen und Variablen\n", + "\n", + "Python unterstützt verschiedene Datentypen. Zu diesen Zählen :\n", + "1. Integer (Ganze Zahlen) $$\\mathbb{Z} = \\{1,-1,2,-2,3,-3,\\dots\\}$$\n", + "2. Floatings Point Numbers (Fließkommazahlen) $$\\pi = 3.141592653589793$$\n", + "3. Strings (Zeichenketten)\n", + "> \"Ich bin eine Zeichenkette\"\n", + "\n", + "4. Listen\n", + "> [Objekt1, Objekt2, 42]\n", + "\n", + "5. Dictionaries\n", + "> {\"Schlüssel1\": \"Wert1\", \"Schlüssel2\": \"Wert2\",}\n", + "\n", + "6. Sets\n", + "> {\"Wert1\", 7, \"Zeichenkette\"}\n", + "\n", + "7. Tupel\n", + "> (42, 7)" + ] + }, + { + "cell_type": "markdown", + "id": "313d37b0-52ad-4de4-9fc5-0f362bfe7284", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-12a63250c85469f1", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Zahlentypen (Floats, Integers)\n", + "\n", + "### Aufgabe 1-1: Zuweisungen von Variablen" + ] + }, + { + "cell_type": "markdown", + "id": "65dae625-2f0b-46d2-803c-c3d6c54000f7", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-782aef1600674714", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Eine Definition und Zuweisung eines Wertes zu einer Variablen erfolgt über den `=` Operator." + ] + }, + { + "cell_type": "markdown", + "id": "fca50dd5-4a56-451a-9a1a-6cbd8d76519a", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-7b71098cec169f0f", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "**Aufgabe** *2 Punkte*: \n", + "\n", + "Definieren Sie zunächst die zwei Variablen `a` und `b` und initialisieren diese mit einem Integerwert ungleich `0`:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d7d24e44-8581-4c5c-a723-83b9f7e418ac", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-7be930fd387f1043", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "scrolled": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# BEGIN SOLUTION\n", + "a = 1\n", + "b = -2\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "8cfd850c-02c7-4b32-b20c-e37f5eb4fe8b", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-d44ec6114b65557c", + "locked": true, + "points": 2, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "assert isinstance(a, int)\n", + "assert isinstance(b, int)\n", + "\n", + "assert a != 0\n", + "assert b != 0" + ] + }, + { + "cell_type": "markdown", + "id": "337fbcc5-c960-4206-83d1-605d05a51d5d", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-2f79b7b52775db8b", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "**Aufgabe** *2 Punkte*:\n", + "\n", + "Definieren Sie zwei Variablen `s` und `t` und initialisieren diese mit einem Floatwert ungleich `0`:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "03b7469a-4f59-437f-aa8f-797d200b41a1", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-7d48f9bed0df944d", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# BEGIN SOLUTION\n", + "s = 1.5\n", + "t = -2.7\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "45404bbe-2026-491d-9aef-9d3ee8894adf", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-3b426f39262c1e03", + "locked": true, + "points": 2, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "assert isinstance(s, float)\n", + "assert isinstance(t, float)\n", + "\n", + "assert s != 0\n", + "assert t != 0" + ] + }, + { + "cell_type": "markdown", + "id": "5452589d-5997-4e8f-b8bb-363925c6166a", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-8690aecc1748ad4a", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Aufgabe 1-2: Operationen auf Zahlen\n", + "\n", + "Aus der Schule sollten die folgenden Grunlegenden Operationen die sich auf Zahlen ausführen lassen bekannt sein:\n", + "\n", + "1. Addition $\\Rightarrow a+b=c$\n", + "2. Subtraktion $\\Rightarrow a-b=c$\n", + "3. Multiplikation $\\Rightarrow a\\cdot b=c$\n", + "4. Division $\\Rightarrow\\frac{a}{b} = c$\n", + "> Teilt man zwei Integer durcheinander werden diese erst in Floats umgewandelt und dann als Float gespeichert: $$10/3=3.3333333333$$\n", + "> Die Integer Division (Ganzzahl Division $\\lfloor\\frac{a}{b}\\rfloor$) (Notiert mit \"//\") zweier Zahlen schneidet den Rest nach dem Komma ab: $$10//3\\equiv 3$$\n", + "\n", + "5. Modulus $\\Rightarrow a\\mod b \\equiv c$\n", + "> \"Teilen mit Rest\" (in Python notiert mit \"%\" hat nichts mit Prozenten zutun) funktioniert genauso wie man die Uhr lesen würde. Ist es 15 Uhr sagt man im Sprachgebrauch 3 Uhr (Mittags). Der Modulus Operator funktioniert genauso. $$15 \\mod 12 \\equiv 3$$\n", + "\n", + "6. Exponentation $\\Rightarrow a^b = c$\n", + "> In Python notiert mit \"a**b\"" + ] + }, + { + "cell_type": "markdown", + "id": "9e408960-4180-4e92-ba88-ebf39441dfa7", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-c4551eabf148e18e", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "**Aufgabe** *2 Punkte*:\n", + "\n", + "Addieren Sie die Werte der Variablen `a` und `b` und speichern Sie das Ergebnis in der Variable `c`:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "6aaa0c05-ae16-4c48-b841-79931dae94bd", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-2ff97153b6652687", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "-1" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# BEGIN SOLUTION\n", + "c = a + b\n", + "# END SOLUTION\n", + "c" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "2fa4d7f2-235d-411e-956c-4ff335705124", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-3ba3833c7220bbb7", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "assert isinstance(c, int)\n", + "### BEGIN HIDDEN TESTS\n", + "assert a + b == c\n", + "### END HIDDEN TESTS" + ] + }, + { + "cell_type": "markdown", + "id": "9fccb90e-1f22-46b9-99a1-14b64274ece5", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-f80a3165c27dc297", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "**Aufgabe** *5 Punkte*:\n", + "\n", + "Nutzen Sie die Variablen `a` & `b` und Speichern Sie die Ergebnisse für die Multiplikation, Division, Ganzzahldivision, Exponentiation und den Modulo-Operator in den unten angegebenen Variablen:\n", + "\n", + "\\begin{align}\n", + "m &= a\\cdot b\\\\\n", + "d &= \\frac{a}{b}\\\\\n", + "i &= \\lfloor\\frac{a}{b}\\rfloor\\\\\n", + "e &= a^b\\\\\n", + "r &= a\\; \\textrm{mod}\\; b\n", + "\\end{align}\n", + "\n", + "\n", + "Die Ausführung der anderen arithmetischen Operationen in Python erfolgt analog. Eine Übersicht können Sie [hier](https://www.python-kurs.eu/operatoren.php) entnehmen." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "30ce28b3-b97d-4b3f-bac0-6d01356dcc60", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-3f3640eaf7ee2dd3", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "### BEGIN SOLUTION\n", + "m = a*b\n", + "d = a/b\n", + "i = a//b\n", + "e = a**b\n", + "r = a%b\n", + "### END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "95108d9d-4cba-489b-bdbc-ed5c71316ac8", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-804a957c4a02e824", + "locked": true, + "points": 5, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "### BEGIN HIDDEN TESTS\n", + "assert m == a*b\n", + "assert d == a/b\n", + "assert i == a//b\n", + "assert e == a**b\n", + "assert r == a%b\n", + "### END HIDDEN TESTS" + ] + }, + { + "cell_type": "markdown", + "id": "444c4633-9186-497f-88a7-e2ec0013dff4", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-7ac5c4d8e6463b16", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Sequentielle Datentypen\n", + "\n", + "Sequentielle Datentypen sind ein wichtiger Bestandteil in der Programmierung. Dazu gehören Listen, Tupel und Strings.\n", + "\n", + "Wichtige Eigenschaften dieser Datentypen sind:\n", + "- Die Elemente von Listen, Strings oder Tupeln sind in einer bestimmten Reihenfolge angeordnet (Diese entspricht der Ordnung in der die Elemente eingefügt worden).\n", + "- Der Zugriff (Lesen und Schreiben) dieser Objekte erfolgt über Indizes (Das erste Element eines Sequentiellen Datentypes ist immer `0`).\n", + "- Zugriff auf Elemente kann auch Rückwärts erfolgen das letzte Element wird dann mit `-1` ausgelesen. \n", + "\n", + "Beispiel für eine Liste:\n", + "`some_list = [\"a\", \"b\", \"c\"]`\n", + "\n", + "Beispiel für ein Tupel:\n", + "`some_tuple = (1, 2, 3)`\n", + "\n", + "Beispiel für ein String:\n", + "`some_string = \"Python ist cool!\"`\n", + "\n", + "### Aufgabe 2-1: Strings\n", + "\n", + "Zeichenketten, Text oder Strings lassen sich in Python mit `'Text'`, `\"Text\"` oder der Funktion `str()` definieren.\n", + "\n", + "**Aufgabe** *2 Punkte*:\n", + "\n", + "Ein String-Objekt (Text) können sie mit Hilfe von `'Some Text'` oder `\"Some Text2\"` definieren. Definieren sie die Variable `text` mit einem beliebigen Text." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "f8028cf5-0dc4-4e72-a98e-3e18705c8c98", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-73a9beb04648359b", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# BEGIN SOLUTION\n", + "text = \"Hi Mom, I am on TV!\"\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "7a6832ae-e6c7-4230-b3ca-b1f1f90345fb", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-1677fa4f3b4eec12", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "assert isinstance(text, str)" + ] + }, + { + "cell_type": "markdown", + "id": "8e10cd2a-53dc-485f-bbdd-aa2709574660", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-05f0b0cd1211c396", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Python Strings lassen sich mit verschiedenen mitteln formatieren. Dazu zählt die [format-Funktion](https://www.w3schools.com/python/ref_string_format.asp) \n", + "\n", + "**Aufgabe** *1 Punkte*:\n", + "\n", + "Geben Sie die Variablen `a` & `b` aus Aufgabe 1 im format `\"a = 12 und b = 12\"` (Die Werte sollen dann den Werten aus ihrer Definition entsprechen. 12 ist hier nur ein Beispiel) aus." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "d3efbadb-3c33-40eb-9260-8f8b11faaf75", + "metadata": { + "editable": true, + "nbgrader": { + "grade": true, + "grade_id": "cell-c94a5b5e9f73479e", + "locked": false, + "points": 1, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a = 1 und b = -2\n" + ] + } + ], + "source": [ + "# BEGIN SOLUTION\n", + "print(\"a = {} und b = {}\".format(a, b))\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "markdown", + "id": "d860edba-749c-41c0-827b-0c68ba6fd00a", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-e4c5420224d04f6a", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Aufgabe 2-2: Listen \n", + "\n", + "Listen lassen sich mit der Funktion `list()` oder `[]` definieren und können eine \"unendliche\" Menge an Elementen unterschiedlichen Datentyps speichern. Die Liste `[420, \"Hallo Jupyter\", 0.222]` ist eine Korrekt definierte Liste. Im Allgemeinen ist es Ratsam listen mit gleichem Datentyp zu füllen, da dies bei der Verarbeitung zu Problemen führen kann." + ] + }, + { + "cell_type": "markdown", + "id": "51416edc-4c96-437c-a1ff-c458f06c9e8a", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-36d12824040df91e", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "**Aufgabe** *1 Punkte*: \n", + "\n", + "Definieren Sie die Variable `l` und weisen Sie dieser Variable eine Liste mit aufsteigenden Integerwerten von `0` bis `4` zu." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "b361ee09-cd48-4c16-89ea-714ee8ab541f", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-89d74b5c210fc331", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# BEGIN SOLUTION\n", + "l = list(range(5))\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "65fcfdb4-58ff-47d3-bebd-d3786a971af2", + "metadata": { + "editable": true, + "nbgrader": { + "grade": true, + "grade_id": "cell-589caab43851d55a", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "### BEGIN HIDDEN TESTS\n", + "assert isinstance(l, list)\n", + "assert l == [0, 1, 2, 3, 4]\n", + "### END HIDDEN TESTS" + ] + }, + { + "cell_type": "markdown", + "id": "a6dfba7d-4bb5-4530-bb75-689843a718a8", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-5ca56027cd6a5698", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "**Aufgabe** *1 Punkte*:\n", + "\n", + "Hängen Sie der Liste `l` noch den Wert `42` an.\n", + "\n", + "Hinweis: Nutzen Sie dafür die Methode [.append](https://www.w3schools.com/python/ref_list_append.asp)." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "e39e50dc-3d97-4579-aeb4-04ec2de3dbb3", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-853db222010bee68", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# BEGIN SOLUTION\n", + "l.append(42)\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "53000a6c-1187-48b0-b038-129d434cc45a", + "metadata": { + "editable": true, + "nbgrader": { + "grade": true, + "grade_id": "cell-c1aca9603460d1de", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "### BEGIN HIDDEN TESTS\n", + "assert l == [0, 1, 2, 3, 4, 42]\n", + "### END HIDDEN TESTS" + ] + }, + { + "cell_type": "markdown", + "id": "4510d2f3-3386-4d33-baa5-1d684ab52370", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-c58e5530e380c09a", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Zugriff auf Elemente eines Sequentiellen Datentypes lassen sich über `[]` realisieren.\n", + "\n", + "Beispiel - Zugriff auf das erste Element einer Liste:" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "id": "259d73e8-eca3-4172-8a0a-1efbbe3b527b", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-cb1b7e8055910efc", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 114, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "l[0]" + ] + }, + { + "cell_type": "markdown", + "id": "bf6d1243-9650-4c27-b3dc-86a2d48b3abc", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-1d8edfe975ed19bf", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "**Aufgabe** *1 Punkte*:\n", + "\n", + "Geben Sie das dritte Element der Liste `l` aus.\n", + "\n", + "Hinweis: Achten Sie darauf das der erste Index immer `0` ist. " + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "id": "358a0b51-3bfa-4e65-9cd4-ee2e7f8bc9d5", + "metadata": { + "editable": true, + "nbgrader": { + "grade": true, + "grade_id": "cell-a386250119dc89fb", + "locked": false, + "points": 1, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n" + ] + } + ], + "source": [ + "# BEGIN SOLUTION\n", + "print(l[2])\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "markdown", + "id": "2f25fa6d-9a72-464b-ada6-d2630dd03e92", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-0ff369c64d2f8c24", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "**Aufgabe** *1 Punkte*:\n", + "\n", + "Geben Sie das vorletzte Element der Liste `l` aus.\n", + "\n", + "Hinweis: Achten Sie darauf das der letzte Index mit `-1` ausgegeben wird" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "id": "16ec2e20-e28e-41de-8f85-1091e41bb401", + "metadata": { + "editable": true, + "nbgrader": { + "grade": true, + "grade_id": "cell-2394235b49ebb749", + "locked": false, + "points": 1, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n" + ] + } + ], + "source": [ + "# BEGIN SOLUTION\n", + "print(l[-2])\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "markdown", + "id": "291522bc-9c4d-4348-b2cb-99f9653168fa", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-c8fe8cb9d2ca1028", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Aufgabe 2-3: Dictionaries\n", + "\n", + "Das Dictionary ist ein Datentyp, welcher Schlüssel-Werte-Paare speichert. Dabei wird ein Dictionary mit `dict()` oder `{\"Schlüssel1\": \"Wert1\"}` initalisiert. Wichtig ist hierbei das ein Dictionary nicht mit `{}` initialisiert werden kann da dies die Notation für das **Set** Objekt ist.\n", + "\n", + "**Aufgabe** *1 Punkte*:\n", + "\n", + "Initialisieren Sie die Dictionary Variable `my_dict` mit folgendem Mapping:\n", + "\n", + "| Key | Value |\n", + "|:----|:------|\n", + "| `\"apple\"` | `\"Apfel\"` |\n", + "| `\"banana\"` | `\"Banane\"` |\n", + "| `\"cherry\"` | `\"Kirsche\"` |" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "c17338bb-c6df-493c-9d88-0e9ea36a755d", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-86ce3695bf3f6780", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "### BEGIN SOLUTION\n", + "my_dict = {\"apple\": \"Apfel\", \"banana\": \"Banane\", \"cherry\": \"Kirsche\"}\n", + "### END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "id": "a367442e-2c8c-4d32-8acb-5bccf94d64fb", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-969a9415b60857a8", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "assert isinstance(my_dict, dict)\n", + "### BEGIN HIDDEN TESTS\n", + "assert my_dict == {\"apple\": \"Apfel\", \"banana\": \"Banane\", \"cherry\": \"Kirsche\"}\n", + "### END HIDDEN TESTS" + ] + }, + { + "cell_type": "markdown", + "id": "8ec10cc1-4b8b-4b53-b1d1-991d6287abda", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-0f5df3b99a4774ba", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "**Aufgabe** *1 Punkte*:\n", + "\n", + "Fügen Sie nun das Key-Value Paar `\"pear\": \"Birne\"` zu `my_dict` hinzu." + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "id": "d3aac185-2d6e-4b30-b247-89be8aeeab7d", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-ed3cf3b9d6a8ad58", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "### BEGIN SOLUTION\n", + "my_dict[\"pear\"] = \"Birne\"\n", + "### END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "id": "c377ec37-b382-4f83-a9cc-829a44b7682e", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-9735fc9ff4416c4c", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "### BEGIN HIDDEN TESTS\n", + "assert my_dict == {\"apple\": \"Apfel\", \"banana\": \"Banane\", \"cherry\": \"Kirsche\", \"pear\": \"Birne\"}\n", + "### END HIDDEN TESTS" + ] + }, + { + "cell_type": "markdown", + "id": "2b3cfdf2-6864-402c-9ded-9fd0c7c489ee", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-957ca6c50c1cfb70", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Für gewisse Anwendungen reicht es nur die Schlüssel (oder Werte) aus einem Dictionary zu haben. Dazu bietet das Dictionary die Funktionen `.keys()` (für eine Liste der Schlüssel) und `.values()` (für eine Liste der Werte).\n", + "\n", + "**Aufgabe** *1 Punkte*:\n", + "\n", + "Geben Sie die nur die Werte des Dictionaries `my_dict` aus." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "03f2c31a-04b4-4dc7-ab00-476cec6922ad", + "metadata": { + "editable": true, + "nbgrader": { + "grade": true, + "grade_id": "cell-f190c63e28ae9e82", + "locked": false, + "points": 1, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dict_values(['Apfel', 'Banane', 'Kirsche'])\n" + ] + } + ], + "source": [ + "### BEGIN SOLUTION\n", + "print(my_dict.values())\n", + "### END SOLUTION" + ] + }, + { + "cell_type": "markdown", + "id": "6e774e49-895b-4bb2-9436-cddb75a3d46d", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-5bd0f8a189d6db1c", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Wichtiger für die meisten Probleme ist die Dictionary Funktion `.items()` diese gibt eine Liste an Tupeln mit den Schlüssel Werte Paaren aus.\n", + "\n", + "**Aufgabe** *1 Punkte*:\n", + "\n", + "Geben Sie die Elemente des Dictionaries `my_dict` mit der Funktion `.items()` aus. " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "a399cf66-43eb-4749-8864-18c5e4202f79", + "metadata": { + "editable": true, + "nbgrader": { + "grade": true, + "grade_id": "cell-03afb00cc074d1ef", + "locked": false, + "points": 1, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dict_items([('apple', 'Apfel'), ('banana', 'Banane'), ('cherry', 'Kirsche')])\n" + ] + } + ], + "source": [ + "### BEGIN SOLUTION\n", + "print(my_dict.items())\n", + "### END SOLUTION" + ] + }, + { + "cell_type": "markdown", + "id": "a8d62b7e-ae53-4bd7-a930-84508c3948f9", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-83b1e45bc901dc68", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Funktionen\n", + "\n", + "Mit einigen Funktionen haben wir uns bereits befasst dazu zählen `print()`, `.keys()` und alle weiteren die diesem Schema folgen.\n", + "\n", + "In diesem Kapitel wollen wir uns mit dem Aufbau von Funktionen befassen. Dabei folgt jede Funktion folgendem Aufbaue:\n", + "\n", + "```python\n", + "def some_function_name(param1, param2):\n", + " a = do_something1(param1)\n", + " b = do_something2(a, param2)\n", + " do_something3(b)\n", + " return b\n", + "```\n", + "\n", + "Das `def`-Schlüsselwort leitet die Definition einer Funktion ein, gefolgt von dem Funktionsnamen, den Eingabeparametern der Funktion in runden Klammern und einem Doppelpunkt. Wichtig ist, dass die Anweisungen innerhalb der Funktion eingerückt sein müssen. Das Ergebnis (oder die Ergebnisse) werden mit Hilfe des `return`-Schlüsselworts gekennzeichnet.\n", + "\n", + "**Aufgabe** *1 Punkte*:\n", + "\n", + "Schreibe eine Funktion `successor` die auf jede Eingabe `+1` rechnet." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "1a151db2-617c-48f4-969b-3bafb45b1fd1", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-c6a731a4a13b2bbc", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# BEGIN SOLUTION\n", + "def successor(n):\n", + " return n+1\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "id": "615a98b6-139e-485b-874e-d0a70cd22517", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-00693d8d9c92af76", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "### BEGIN HIDDEN TESTS\n", + "assert successor(1) == 2\n", + "### END HIDDEN TESTS" + ] + }, + { + "cell_type": "markdown", + "id": "d6f47a61-b692-4f46-8ccc-83af10189f93", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-9c358751403a1986", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "**Aufgabe** *1 Punkte*:\n", + "\n", + "Schreibe eine Funktion `add` mit den Eingabeparametern `a` & `b`, welche die Werte von `a` & `b` miteinander addiert." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "3f101d21-aa1a-4bf3-aadf-bb4e41d8fe12", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-2b72cf583fed9b8c", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# BEGIN SOLUTION\n", + "def add(a,b):\n", + " return a+b\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "1d155c26-0875-4a71-8564-a4a0e0e3bb70", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-7a24b5cfd7fc9990", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "### BEGIN HIDDEN TESTS\n", + "assert add(1,2) == 3\n", + "### END HIDDEN TESTS" + ] + }, + { + "cell_type": "markdown", + "id": "d77ab363-9fe0-4504-b43b-6f7894666525", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-0fd1dbfed99faa8a", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Kontrollstruckturen\n", + "\n", + "## Aufgabe 3-1: Conditionals - If-Else\n", + "\n", + "Um Entscheidungen treffen zu können nutzt man in Python das Kommando `if ` ist der Ausdruck wahr wird der darauf folgende Code ausgeführt.\n", + "\n", + "Liste von möglichen Ausdrücken:\n", + "\n", + "- `a == b` checkt ob die Werte `a` & `b` gleich sind\n", + "- `a != b` checkt ob die Werte `a` & `b` **nicht** gleich sind\n", + "- `a > b` checkt ob der Wert `a` größer als `b` ist (Analog dazu \"größer gleich\" `a >= b`)\n", + "- `a < b` checkt ob der Wert `a` kleiner als `b` ist (Analog dazu \"kleiner gleich\" `a <= b`)\n", + "- `not ` invertiert das Ergebnis des Ausdruckes, also aus einem wahren Ausdruck wird ein falscher und andersherum.\n", + "\n", + "Zur Verkettung von Ausdrücken:\n", + "\n", + "- ` and ` checkt ob die Ausdrücke `ausdruck1` & `ausdruck2` wahr also erfüllt sind\n", + "- ` or ` checkt ob einer der Ausdrücke `ausdruck1` & `ausdruck2` wahr also erfüllt sind\n", + "\n", + "Beispiel:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "4363cda5-98c5-4424-8fb3-7c92e1994993", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-020d46673782a358", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You're the Number One\n" + ] + } + ], + "source": [ + "zahl = 1\n", + "if zahl == 1:\n", + " print(\"You're the Number One\")\n", + "\n", + "if zahl == 2:\n", + " print(\"You Lose\")" + ] + }, + { + "cell_type": "markdown", + "id": "21a23914-d0b7-492d-bcfe-8ecde9c20c85", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-aa2d59d677afd5a3", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Das Kommando `else` funktioniert nur zusammen mit dem `if` Kommando und bietet dem Programm eine Art \"Fall Back\":" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "3eaf3062-ae81-48c0-802d-88a72db587be", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-f4124dd62687158f", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You're not the Number One\n" + ] + } + ], + "source": [ + "zahl = 5\n", + "if zahl == 1:\n", + " print(\"You're the Number One\")\n", + "else:\n", + " print(\"You're not the Number One\")" + ] + }, + { + "cell_type": "markdown", + "id": "7e35f339-3f59-4fd6-a162-e6eb0379c778", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-167fb232c7163fe6", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Um auf mehrere Ausdrücke zu checken kann das `elif` verwendet werden. Es findet seinen Platz zwischen `if` & `else`:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "e37dd53c-e375-4548-9563-c8c6664dfdd0", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-0c0312666fa7648f", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You're the Number Two\n" + ] + } + ], + "source": [ + "zahl = 2\n", + "if zahl == 1:\n", + " print(\"You're the Number One\")\n", + "elif zahl == 2:\n", + " print(\"You're the Number Two\")\n", + "elif zahl == 2:\n", + " print(\"You're the Number Three\")\n", + "else:\n", + " print(\"You're not the Number One\")" + ] + }, + { + "cell_type": "markdown", + "id": "5248404d-4717-462d-a67f-57431e599945", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-060bd6eb927fa8b1", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "**Aufgabe** *1 Punkte*:\n", + "\n", + "Schreibe eine Funktion `is_odd` mit einem Eingabeparameter `n` die prüft ob die eingegebene Zahl ungerade ist.\n", + "\n", + "Wenn die Zahl gerade ist gebe den Text `\"Gerade Zahl\"` und bei ungerade `\"Ungerade Zahl\"` zurück." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "d4b1cef3-6222-438d-bbc3-243431fad0cb", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-77afd241bc69d6b1", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# BEGIN SOLUTION\n", + "def is_odd(n):\n", + " if n % 2 == 0:\n", + " return \"Gerade Zahl\"\n", + " else:\n", + " return \"Ungerade Zahl\"\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "141d73da-90e6-401a-a651-ad14635de5b7", + "metadata": { + "editable": true, + "nbgrader": { + "grade": true, + "grade_id": "cell-d8541ba8c61147c3", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "### BEGIN HIDDEN TESTS\n", + "assert is_odd(2).lower() == \"Gerade Zahl\".lower()\n", + "assert is_odd(3).lower() == \"Ungerade Zahl\".lower()\n", + "### END HIDDEN TESTS" + ] + }, + { + "cell_type": "markdown", + "id": "c0086b8c-da02-4fdf-8341-9c0518bb6406", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-69409d8dcfe070e1", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Aufgabe 3-2: Sequentielles - While Loop\n", + "\n", + "*7 Punkte*\n", + "\n", + "Schleifen sind wichtig um eine Aufgabe öfter zu wiederholen. \n", + "\n", + "Schauen wir uns dazu zunächst den `while`-loop an. Die Syntax schaut wie folgt aus:\n", + "\n", + "```python\n", + "while :\n", + " do_something()\n", + "```\n", + "\n", + "Solange der Ausdruck nach dem `while` wahr ist wird die Schleife ausgeführt. **!Vorsichtig!** solange der Ausdruck wahr bleibt und nie falsch wird hört die Schleife nie auf zu laufen.\n", + "\n", + "**Aufgabe**: Schreibe eine Funktion `fubar` mit Eingabeparameter `n`.\n", + "Die Funktion soll wie folgt definiert sein:\n", + "\n", + "- Der Eingabeparameter `n` ist ein Integer, Floats geben `False` zurück\n", + "- Negative zahlen & 0 beenden die Funktion und geben `False` zurück\n", + "- Die Funktion zählt bis einschließlich dem Eingabeparameter\n", + " bsp.: $n=9 \\rightarrow 1, 2, 3, \\dots, 9$\n", + "- Bei jedem Schleifendurchlauf soll die Zahl bei der sich die Schleife gerade befindet mittels `print` ausgegeben werden werden.\n", + "- Ist der zurzeitige Schleifendurchlauf durch `3` teilbar, gebe mittels `print` denn String `Foo` aus.\n", + "- Ist der zurzeitige Schleifendurchlauf durch `5` teilbar, gebe mittels `print` denn String `Bar` aus.\n", + "- Ist der zurzeitge Schleifendurrchlauf durch `3 & 5` teilbar, gebe mittels `print` den String `FooBar` aus.\n", + "\n", + "**Tipp**: Implementiere nicht alles aufeinmal sollte Schritt für Schritt und teste deine Lösung nach jedem Schritt.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "d1f074e2-c036-445c-97f6-618f5aa4cedb", + "metadata": { + "editable": true, + "nbgrader": { + "grade": true, + "grade_id": "cell-0796f3b2cbac6f8e", + "locked": false, + "points": 4, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# BEGIN SOLUTION\n", + "def fubar(n: int):\n", + " if isinstance(n, float) or n < 1:\n", + " return False\n", + "\n", + " count = 1\n", + " while count <= n:\n", + " msg = count\n", + " if count % 3 == 0:\n", + " msg = \"Foo\"\n", + " if count % 5 == 0:\n", + " msg = \"Bar\"\n", + " if count % 15 == 0:\n", + " msg = \"FooBar\"\n", + " \n", + " count += 1\n", + " print(msg, end=', ')\n", + " \n", + "# END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "22784528-9205-4575-84ef-0060732cd053", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-f7774d4246e958a6", + "locked": true, + "points": 3, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fubar to 4\n", + "1, 2, Foo, 4, \n", + "Fubar to 6\n", + "1, 2, Foo, 4, Bar, Foo, \n", + "Fubar to 16\n", + "1, 2, Foo, 4, Bar, Foo, 7, 8, Foo, Bar, 11, Foo, 13, 14, FooBar, 16, \n", + "Fubar to 200\n", + "1, 2, Foo, 4, Bar, Foo, 7, 8, Foo, Bar, 11, Foo, 13, 14, FooBar, 16, 17, Foo, 19, Bar, Foo, 22, 23, Foo, Bar, 26, Foo, 28, 29, FooBar, 31, 32, Foo, 34, Bar, Foo, 37, 38, Foo, Bar, 41, Foo, 43, 44, FooBar, 46, 47, Foo, 49, Bar, " + ] + } + ], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "print(\"Fubar to 4\")\n", + "fubar(4)\n", + "print(\"\\nFubar to 6\")\n", + "fubar(6)\n", + "print(\"\\nFubar to 16\")\n", + "fubar(16)\n", + "print(\"\\nFubar to 200\")\n", + "fubar(50)\n", + "### BEGIN HIDDEN TESTS\n", + "assert fubar(-1) == False\n", + "assert fubar(0) == False\n", + "assert fubar(.1) == False\n", + "### END HIDDEN TESTS" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Material/wise_24_25/lernmaterial/2.Tutorial_2.ipynb b/Material/wise_24_25/lernmaterial/2.Tutorial_2.ipynb new file mode 100644 index 0000000..1d831bb --- /dev/null +++ b/Material/wise_24_25/lernmaterial/2.Tutorial_2.ipynb @@ -0,0 +1,1481 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "079afb70-639e-4955-8ca7-1c290cbf08a9", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-7057e40105900012", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# 2. Programmierübung: Python Tutorial\n", + "\n", + "
\n", + "
\n", + " Willkommen zur ersten Programmierübung Einführung in Python 3.\n", + "
\n", + " \n", + "
\n", + "\n", + "Wenn Sie Fragen oder Verbesserungsvorschläge zum Inhalt oder Struktur der Notebooks haben, dann können sie eine E-Mail an Phil Keier ([p.keier@hbk-bs.de](mailto:p.keier@hbk-bs.de?subject=[SigSys]%20Feedback%20Programmierübung&)) oder Martin Le ([martin.le@tu-bs.de](mailto:martin.le@tu-bs.de?subject=[SigSys]%20Feedback%20Programmierübung&)) schreiben.\n", + "\n", + "Link zu einem Python Spickzettel: [hier](https://s3.amazonaws.com/assets.datacamp.com/blog_assets/PythonForDataScience.pdf)\n", + "\n", + "Der Großteil des Python-Tutorials stammt aus der Veranstaltung _Deep Learning Lab_ und von [www.python-kurs.eu](https://www.python-kurs.eu/python3_kurs.php) und wurde für _Signale und Systeme_, sowie _Einführung in die Programmierung für Nicht Informatiker_ angepasst." + ] + }, + { + "cell_type": "markdown", + "id": "85fd88de-a9ee-4149-8bed-1b8ebc0bbad4", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-26e0f96baeb79aac", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Kontrollstruckturen\n", + "\n", + "## Sequentielles - For Loop\n", + "\n", + "Python verwendet eine spezielle Form des 'for-loops' dabei handelt es sich sprachlich um den 'for-each loop'.\n", + "\n", + "Mittlerweile hat jede nennenswerte Programmiersprache das Konzept des 'for-each loops' auf seine Weise implementiert. Python hingegen nutzt diesen als Standard. Sprachen wie JavaScript, C/C++, etc. verwenden standardmässig eine 'Zählschleife', dabei wird meist von '0' angefangen bis zu einem Grenzwert 'n' gezählt.\n", + "\n", + "Ein schönes beispiel bietet hierfür JavaScript:\n", + "\n", + "```js\n", + "for (let i = 0; i < arr.length; i++) {\n", + " // do something\n", + "} \n", + "```\n", + "\n", + "Zu lesen ist dies wie folgt: \"Für ein i mit dem Wert 0 (let i = 0), zähle bis i größer die Länge von Array arr (i < arr.length) und erhöhe nach jedem Schleifendurchlauf den Wert von i um 1 (i++)\"\n", + "\n", + "In Python sehe selbiger Code wie folgt aus:\n", + "\n", + "```python\n", + "for i in range(0,len(arr)):\n", + " # do something\n", + "```\n", + "\n", + "Zu lesen ist dies wie folgt: \"Für jedes (for each) i in dem Intervall/Menge 0 bis arr.length mach etwas\"\n", + "\n", + "Der Unterschied besteht darin das Python jedes Element einer Menge durchläuft, der Catch liegt darin das es absolut unabhängig davon ist wie die Menge aussieht. Widmen wir uns zunächst einer Aufgabe:" + ] + }, + { + "cell_type": "markdown", + "id": "7215a3e7-a240-43ec-914c-10221d8b28b0", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-80add6da9914f961", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Aufgabe \n", + "\n", + "*3 Punkte*\n", + "\n", + "Schreibe eine Funktion `sum_up` mit Eingabeparameter `n`, welcher die Zahlen von `1...n` aufsummiert.\n", + "\n", + "Nutze dafür einen `for-loop`.\n", + "\n", + "**Beispiel**:\n", + "\n", + "$$n = 5$$ \n", + "$$sum\\_up(5) \\rightarrow 1 \\rightarrow 1 + 2 = 3 \\rightarrow 3 + 3 = 6 \\rightarrow 6 + 4 = 10 \\rightarrow 10 + 5 = 15$$\n", + "\n", + "Hinweis: die Funktion `range()` zählt standardmässig von `0...n-1`. Schauen Sie sich gerne dazu die offizielle Dokumentation an [PEP 204](https://peps.python.org/pep-0204/#list-ranges)." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "5426ddf1-2d2f-4c92-b007-2f6eca61703f", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-d43ef87a62b03cdf", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# BEGIN SOLUTION\n", + "def sum_up(n: int) -> int:\n", + " count = 0\n", + " for i in range(1,n+1):\n", + " count += i\n", + " return count\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "3c38a839-3ab0-466c-98f9-189c35fc5025", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-cff511e86dce0377", + "locked": true, + "points": 3, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "15\n" + ] + } + ], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "print(sum_up(5))\n", + "### BEGIN HIDDEN TESTS\n", + "for n in range(3,12):\n", + " assert sum(range(n+1)) == sum_up(n)\n", + "### END HIDDEN TESTS" + ] + }, + { + "cell_type": "markdown", + "id": "4e6dfa94-18b9-4fb2-830a-83202d034752", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-02370acddb67290d", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Nachdem wir nun gelernt haben wie man mit der Built-In Funktion 'range' zählen kann, schauen wir uns folgend ein paar Beispiele an wie in Python eigentlich Iteriert werden soll.\n", + "\n", + "#### Beispiel 1 - Iterieren über eine Liste:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db89c7c5-6efc-49bb-be92-414a7334ed84", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-dd3ea63dd3b1d927", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "square_numbers = [1,4,9,16,25,36]\n", + "for number in square_numbers:\n", + " print(number)" + ] + }, + { + "cell_type": "markdown", + "id": "6413a239-c334-491e-8062-7f78f75182fe", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-9bc7f123a8fb7680", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "#### Beispiel 2 - Iterieren über ein Dictionary:\n", + "\n", + "Erweitern wir Beispiel 1 und arbeiten nun mit einem Dictionary. Dieses Besteht wie Sie noch aus dem ersten Tutorial Wissen immer aus 'key-value' paaren. Mit der Built-In Funktion `.items()` bekommen wir ein Tuple an Werten zurück, welches erst entpackt werden muss. Dazu behilft uns der 'for-loop' indem einfach 2 variabeln gleichzeitig deklariert werden. (Achtung! Mit `.items()` werden die 'key-value' paare als '(key, value)' zurückgegeben)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "116ce552-a5c0-4c9c-8d89-fe1f3e40bdba", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-72122af8e519273b", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "square_numbers_dict = {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36}\n", + "\n", + "for key, value in square_numbers_dict.items():\n", + " print(key, \"->\" , value)" + ] + }, + { + "cell_type": "markdown", + "id": "b4e748de-0603-41c9-8282-86e92923e358", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-52b4d0167c7fb9ba", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "#### Beispiel 3 - Iteration mit Zählen:\n", + "\n", + "Die Built-In Funktion `enumerate()` [PEP 279](https://peps.python.org/pep-0279/) ermöglicht das Zählen und gleichzeitige iterieren über eine Liste.\n", + "Dabei wird wieder ein Tuple zurückgegeben welches die Form '(index, value)' annimmt." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8cbf9142-2cf3-4579-9e19-799ee9b25a54", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-29953c29ed4bcdcf", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "alphabet = [\"a\", \"b\", \"c\", \"d\"]\n", + "for index, buchstabe in enumerate(alphabet):\n", + " print(index, \"->\", buchstabe)" + ] + }, + { + "cell_type": "markdown", + "id": "4add1ce5-e462-4be3-8bd7-9960d86ae780", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-b64ce270167d3025", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Mit den traditionellen Mitteln lässt sich der absolut Selbe Output generieren. Das verwenden von `enumerate()` ist jedoch eleganter:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2e8274b-00d4-4042-adbf-937aea8f0e7e", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-8b2e3cb4e0c977f2", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "alphabet = [\"a\", \"b\", \"c\", \"d\"]\n", + "for index in range(len(alphabet)):\n", + " print(index, \"->\", alphabet[index])" + ] + }, + { + "cell_type": "markdown", + "id": "b504f072-53ce-4d03-9f72-b4d4ba85ae74", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-5e8d9fc47a709ba4", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Aufgabe\n", + "\n", + "*2 Punkte*\n", + "\n", + "Ihnen ist das Dictionary `dict2` gegeben. Ändern Sie jeden Wert in dem Dictionary nach der Formel $f(x) = x^3-1$ mittels `for-loop`.\n", + "\n", + "Tipp: Lassen Sie sich nicht von den Schlüsseln verwirren." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "abd323c0-5e1b-4c14-a65a-9d54a06f3a80", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-0361320c63b2cb03", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "dict2 = {\"a\": 56, 5: 12, \"python\": 9, 3.14: 1.141414}\n", + "### BEGIN SOLUTION\n", + "dict2 = {key: value**3-1 for key, value in dict2.items()}\n", + "### END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "7e0f9ac4-c5d4-44b6-a2fc-db98e2b46356", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-82eec3cba623ab8f", + "locked": true, + "points": 2, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'a': 175615, 5: 1727, 'python': 728, 3.14: 0.48706374396146557}\n" + ] + } + ], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "print(dict2)\n", + "### BEGIN HIDDEN TESTS\n", + "d = {\"a\": 56, 5: 12, \"python\": 9, 3.14: 1.141414}\n", + "d = {key: value**3-1 for key, value in d.items()}\n", + "assert d == dict2\n", + "### END HIDDEN TESTS" + ] + }, + { + "cell_type": "markdown", + "id": "ecc21f6a-2ea0-41a0-9e56-04faae5a0fc6", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-9ffa970f1cdac592", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Mit dem Unterstrich `_` als Zählvariable werden `for`-loops gekennzeichnet die ihre Zählvariable nicht verwenden:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "786461b8-ecf9-4afb-8b93-6186f53f6e97", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-8316e1e4eaa0ea0b", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Python is Nice!\n", + "Python is Nice!\n", + "Python is Nice!\n" + ] + } + ], + "source": [ + "for _ in range(3):\n", + " print(\"Python is Nice!\")" + ] + }, + { + "cell_type": "markdown", + "id": "7fd320aa-6bb5-4b9b-9593-2df69cb2ca1e", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-cb8f33d1ae55a6a4", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## List Comprehension\n", + "\n", + "Seit dem Proposal von [PEP 202](https://peps.python.org/pep-0202/) gibt es in Python die List Comprehension.\n", + "\n", + "Für diese Vorlesung ist es nicht nötig das Sie die Syntax anwenden können, Sie sollten zumindest verstehen wie diese funktioniert.\n", + "\n", + "Angenommen wir haben folgende Mathematische beschreibung einer Menge $$\\{x^2 \\vert x \\in \\mathbb{N}\\}$$\n", + "\n", + "Dies beschreibt die Funktion $f(x) = x^2$ für alle natürlichen Zahlen.\n", + "\n", + "In Python ist es möglich genau diese Menge in einer einzigen Zeile Abzubilden. Dazu wird die List Comprehension verwendet deren Syntax im allgemeinen folgende Form hat:\n", + "\n", + "```python\n", + "[ for value in ]\n", + "```\n", + "\n", + "Schauen wir uns dazu an wie wir die Quadrat Zahlen von `1...6` also `1...36` erzeugen." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7bcdc9d9-cc5b-49be-8cfb-ca40eb3b7796", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-4fd6f801463c5ea6", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "squared = [n*n for n in range(1,7)]\n", + "print(squared)" + ] + }, + { + "cell_type": "markdown", + "id": "b6dcb24c-e01e-4522-8ac4-074adfe6105a", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-c6922240434c9d3a", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Probieren Sie sich gerne selber aus.\n", + "\n", + "### Zusatzaufgabe \n", + "\n", + "*Keine Punkte*\n", + "\n", + "Erstellen Sie eine List mittels List Comprehension, welche die Zahlen `1...6` auf deren kubische Zahl `1...216` also der Funktion $f(x) = x^3$ abbildet." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "522f3228-1797-4ca2-9103-44fce48dfd4a", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-1dc645632c5f653a", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "cubics = []\n", + "### BEGIN SOLUTION\n", + "cubics = [n**3 for n in range(1,7)]\n", + "### END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "7dc19b9f-116b-4741-a798-a66d495d477e", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-4e441b6db861559e", + "locked": true, + "points": 0, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 8, 27, 64, 125, 216]\n" + ] + } + ], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "print(cubics)\n", + "### BEGIN HIDDEN TESTS\n", + "c = [n**3 for n in range(1,7)]\n", + "assert c == cubics\n", + "### END HIDDEN TESTS" + ] + }, + { + "cell_type": "markdown", + "id": "5b1355f0-29ed-4318-92f2-51f151c7946e", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-7d9eebd920496d59", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# System Interactions\n", + "\n", + "Im folgenden Abschnitt beschäftigen wir uns mit dem Eingeben von Daten in ein Programm. Dies geschieht entweder 'von Hand', also über den Benutzer, oder über Dateien." + ] + }, + { + "cell_type": "markdown", + "id": "976a7ad0-856d-4fb6-bba8-485668df22a2", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-e2df7221e04e8c54", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Im Normalfall wollen wir größere Datenmengen einlesen. Dazu nutzen wir die Built-In Funktion `open` ([Python Docs - Open](https://docs.python.org/3/library/functions.html?highlight=open#open)). Auch wenn in der Doku viele Parameter stehen benötigt man im Normalfall nur zwei. Der erste ist der Name der File, der zweite im welchem Modus die Datei geöffnet werden soll (Angegeben als String).\n", + "\n", + "Zum bearbeiten der Datei nutzen wir den Python Kontext Manager - das `with`-Statement. Bei externen Daten ist es immer wichtig die Datei auch wieder zu schließen, damit es nicht zu Datenverlust oder Arbeitsspeichermüll kommt. Daher ist der Lebenzyklus einer Datei in einem Programm immer `Datei öffnen` -> `Datei Bearbeiten` -> `Datei schließen`. Kommt es in einer der Drei schritte zu einem Fehler, bleibt die Datei im RAM hängen und der Computer muss neu gestartet werden um diesen Speicher wieder Frei zu geben.\n", + "\n", + "Daher gibt es Kontext Manager. Dieser versichert dem Programmierer, dass das schließen der Datei immer (!!) passiert. Die Syntax folgt folgender Strucktur:\n", + "\n", + "```python\n", + "with as :\n", + " # do something\n", + "```\n", + "\n", + "Dabei ist `` ein Objekt (für uns eine Datei) und `` die Zuweisung zu einer Variablen. Für die Funktion `open` (im Lesemodus) sieht der Kontext wie folgt aus:\n", + "\n", + "```python\n", + "with open(\"filename.txt\", \"r\") as f:\n", + " f.readlines() # do something with f\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "a345cdf5-d1a0-4bd8-9f77-06e6d4562e00", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-58fb9b7e476f3ef2", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Aufgabe\n", + "\n", + "*2 Punkte*\n", + "\n", + "Erstellen und Öffnen sie eine Datei `testfile.txt` mit der `open` Funktion, nutzen Sie dafür das `with`-Statement.\n", + "\n", + "Schreiben Sie in diese Datei 100 mal den String `\"Python\\n\"`. " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "f11f7a0b-bcca-4db0-a6ca-bf95c70c7303", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-0735bb589edcc6a8", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# BEGIN SOLUTION\n", + "with open('testfile.txt', 'w') as f:\n", + " for _ in range(100):\n", + " f.write(\"Python\\n\")\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "c91e07bb-fc41-42c1-8b42-0aca56c57c35", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-2592f8b51914455e", + "locked": true, + "points": 2, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "### BEGIN HIDDEN TESTS\n", + "with open('testfile.txt', 'r') as f:\n", + " lines = f.readlines()\n", + " assert len(lines) == 100\n", + " for line in lines:\n", + " assert line == 'Python\\n'\n", + "### END HIDDEN TESTS" + ] + }, + { + "cell_type": "markdown", + "id": "4adb5400-8749-4790-ae49-68a8622b4a3d", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-39769ee8cbf2157d", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Aufgabe\n", + "\n", + "*2 Punkte*\n", + "\n", + "Öffnen Sie die zuvor erstellte Datei `testfile.txt` im Lesemodus und weißen Sie den Inhalt der `.readlines()` Funktion der Variabeln `lines` zu. " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "adf300e9-ee63-4da1-a6f3-c768fa2b5fc9", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-0a3b9e01dd66e134", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "lines = None\n", + "# BEGIN SOLUTION\n", + "with open('testfile.txt', 'r') as f:\n", + " lines = f.readlines()\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "229499d6-bb33-492b-af5d-a26ab3b3f5d4", + "metadata": { + "editable": true, + "nbgrader": { + "grade": true, + "grade_id": "cell-aa7c104b5f3f2572", + "locked": true, + "points": 2, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Anzahl der gelesenen Zeilen: 100\n" + ] + } + ], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "print(\"Anzahl der gelesenen Zeilen:\", len(lines))\n", + "### BEGIN HIDDEN TESTS\n", + "with open('testfile.txt', 'r') as f:\n", + " assert f.readlines() == lines\n", + "### END HIDDEN TESTS" + ] + }, + { + "cell_type": "markdown", + "id": "47d92dde-16a1-4c11-a452-cadd74255db2", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-be695e1423a6ccf4", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Import Statement\n", + "\n", + " \n", + "\n", + "Da wir nicht immer das Rad neu erfinden wollen nutzen wir Bibliotheken von anderen Entwicklern.\n", + "\n", + "Dazu nutzt man das Keyword `import` gefolgt von dem Modul welches man Importieren möchte. Nutzen wir als Beispiel `numpy`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ced37c65-87d2-48d0-a0ba-4674dcaf104c", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-7d19506e181bcda9", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy" + ] + }, + { + "cell_type": "markdown", + "id": "f5506975-e1cd-434a-8ef1-05a7a06992df", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-b7d981325bea8b84", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Möchte man nun eine Funktion aus dem Modul nutzen folgt die Syntax der Strucktur `.`. Dazu folgendes Numpy Beispiel:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69c68b31-d0f7-469b-ae54-eef871ec6ad6", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-25ad372a576a793e", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "numpy.array(range(100))" + ] + }, + { + "cell_type": "markdown", + "id": "7c5d65db-d1e8-4cad-884e-bb595c57d445", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-0176c541098f7c21", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Aufgabe\n", + "\n", + "*3 Punkte*\n", + "\n", + "Importiere Python Built-In Library `random` und rufe zuerst aus dem Modul die Funktion `seed` auf mit dem Eingabewert `42`, und weiße danach der Variable `rand` den Wert des Funktionsaufrufes von `randint(1,100)` zu. " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "0d80bc9f-6923-4e3f-8a70-909548e693a6", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-8ccc5fe1848176c8", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "rand = None\n", + "# BEGIN SOLUTION\n", + "import random\n", + "random.seed(42)\n", + "rand = random.randint(1,100)\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "ada0211b-03bf-463a-b932-2bad621d5559", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-d7817c3dd1ee34f9", + "locked": true, + "points": 3, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "82\n" + ] + } + ], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "print(rand)\n", + "### BEGIN HIDDEN TESTS\n", + "assert rand == 82\n", + "### END HIDDEN TESTS" + ] + }, + { + "cell_type": "markdown", + "id": "f7b3bdcc-825e-4607-8804-a5ce3d39ace5", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-2cc1d2ed682d1b0e", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Das Keyword `as` ist bereits bekannt, dieses kann auch verwendet werden um Module beim import umzubennen. Dies ist dann Hilfreich wenn Module lange Namen haben.\n", + "\n", + "Numpy wird im Internet immer mit np abgekürzt. Beispiel:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f115eae9-500b-448e-a1be-e3b43ffad0fd", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-60f357d6dda4a8d3", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "np.array(range(100))" + ] + }, + { + "cell_type": "markdown", + "id": "f7570244-0fea-4683-a19c-069f6ba619dd", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-94fb7e92492a12f7", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Aufgabe\n", + "\n", + "*1 Punkt*\n", + "\n", + "Importieren Sie die Built-In Library `datetime` als `dt`." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "e7e6c246-6dc4-4555-a202-73887b5f8249", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-59dc2ded4f59471f", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# BEGIN SOLUTION\n", + "import datetime as dt\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "b03ee34b-8520-4106-a23f-4419e54dcfcc", + "metadata": { + "editable": true, + "nbgrader": { + "grade": true, + "grade_id": "cell-d77ffdb7f9ba178d", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2024-11-01 19:32:22.691479\n" + ] + } + ], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "print(dt.datetime.now()) # UTC Time also Standard Greenwich Zeit\n", + "### BEGIN HIDDEN TESTS\n", + "assert 'dt' in dir()\n", + "### END HIDDEN TESTS" + ] + }, + { + "cell_type": "markdown", + "id": "1cc39ffb-1207-4aa8-a4fe-51df2335fea6", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-c55653efe0a77419", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Möchte man nur eine Bestimmte Funktion aus einem Modul haben nutzt man die `import from` Syntax. Beispiel Pretty Print:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "638e6c20-7bba-4862-9acc-34031bae8514", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-f84e2596969633f5", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{0: 1,\n", + " 1: 2,\n", + " 2: 4,\n", + " 3: 8,\n", + " 4: 16,\n", + " 5: 32,\n", + " 6: 64,\n", + " 7: 128,\n", + " 8: 256,\n", + " 9: 512,\n", + " 10: 1024,\n", + " 11: 2048,\n", + " 12: 4096,\n", + " 13: 8192,\n", + " 14: 16384,\n", + " 15: 32768,\n", + " 16: 65536,\n", + " 17: 131072,\n", + " 18: 262144,\n", + " 19: 524288}\n" + ] + } + ], + "source": [ + "from pprint import pprint\n", + "pprint({n: 2**n for n in range(20)})" + ] + }, + { + "cell_type": "markdown", + "id": "c1e077c1-59a5-411b-bf71-32ea66dc731d", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-0ac2347c47ff5774", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Aufgabe\n", + "\n", + "*2 Punkte*\n", + "\n", + "Importieren Sie die Funktion `sqrt` aus dem Built-In Modul `math`.\n", + "Berechnen Sie $\\sqrt4$. Speichern Sie das Ergebnis in der variablen `s4`." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "81838f9b-558c-49b3-90ef-647e28380a97", + "metadata": { + "editable": true, + "nbgrader": { + "grade": false, + "grade_id": "cell-7c1ea8bca61d5c12", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# BEGIN SOLUTION\n", + "from math import sqrt\n", + "s4 = sqrt(4)\n", + "# END SOLUTION" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "6d984a74-a93d-4865-b6d1-d2dec8586907", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-83c667de468e9ef8", + "locked": true, + "points": 2, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.0\n" + ] + } + ], + "source": [ + "# Hier werden die Loesungen getestet...\n", + "print(s4)\n", + "### BEGIN HIDDEN TESTS\n", + "assert 'sqrt' in dir()\n", + "assert int(s4) == 2\n", + "### END HIDDEN TESTS" + ] + }, + { + "cell_type": "markdown", + "id": "6edf5dce-17d2-4a5f-9d96-2c7c3091de88", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-814b3bfa4b6e049a", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Ein letzter Hinweis: Es gibt auch die Möglichkeit in der `import from` Syntax das Keyword `as` zu verwenden.\n", + "\n", + "Beispiel aus dem Modul `dataclasses` importiert `dataclass` als `dclass`:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "b707bf52-546f-4689-8216-c5ad0b9665a7", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-9961359e9d09d79b", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "from dataclasses import dataclass as dclass\n", + "print(dclass)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Material/wise_24_25/lernmaterial/4.NumPy_MatPlotLib.ipynb b/Material/wise_24_25/lernmaterial/4.NumPy_MatPlotLib.ipynb index a729404..35e6c6f 100644 --- a/Material/wise_24_25/lernmaterial/4.NumPy_MatPlotLib.ipynb +++ b/Material/wise_24_25/lernmaterial/4.NumPy_MatPlotLib.ipynb @@ -48,7 +48,7 @@ "source": [ "# Was ist NumPy\n", "\n", - "NumPy steht für *Numerical Python*, ist OpenSource und wird mittlerweile von nahezu jedem Python Entwickeler verwendet. Dabei ist das Core Feature von NumPy seine effiziente Implementierung eines n-dimensionales Arrays in C, welches in Python verwendet werden kann. Hinzu kommt eine Hülle an Funktionen wie effiziente Zufallsalgorithmen und mathematische Funktionen aus den unterschiedlichten Bereichen der Statistik und numerischen Berechnung, welche alle für NumPy Arrays Optimiert sind. Im folgenden wollen wir den Umgang mit NumPy Arrays lernen. \n", + "NumPy steht für *Numerical Python*, ist OpenSource und wird mittlerweile von nahezu jedem Python Entwickeler verwendet. Dabei ist das Core Feature von NumPy seine effiziente Implementierung eines n-dimensionales Arrays in C, welches in Python verwendet werden kann. Hinzu kommt eine Hülle an Funktionen wie effiziente Zufallsalgorithmen und mathematische Funktionen aus den unterschiedlichten Bereichen der Statistik und numerischen Berechnung, welche alle für NumPy Arrays optimiert sind. Im Folgenden wollen wir den Umgang mit NumPy Arrays lernen. \n", "\n", "__Für dieses Notebook schauen Sie bitte in die [NumPy Docs](https://numpy.org/doc/stable/reference/index.html)!!!__ Dort sind alle Funktionen beschrieben die wir hier bearbeiten und noch mehr!\n", "\n", @@ -71,7 +71,7 @@ "source": [ "# Was ist Matplotlib\n", "\n", - "Matplotlib ist eine Python Bibliothek zum (interaktiven) Visualisieren von Daten. Die Bibliothek intergiert sich super mit anderen viel Benutzten Python Bibliotheken wie NumPy. Der Vorteil in Kombination mit Jupyter besteht in der direkten Ausgabe eines Plots auf dem Bildschirm.\n", + "Matplotlib ist eine Python Bibliothek zum (interaktiven) Visualisieren von Daten. Die Bibliothek integriert sich gut mit anderen viel benutzten Python Bibliotheken wie NumPy. Der Vorteil der Kombination mit Jupyter besteht in der direkten Ausgabe eines Plots auf dem Bildschirm.\n", "\n", "__Nutzen Sie für diese Aufgabe gerne die [Matplotlib Reference](https://matplotlib.org/stable/users/index.html)__\n", "\n", @@ -150,13 +150,13 @@ "source": [ "# Was ist ein Array?\n", "\n", - "Ein Array ist eine kontinuierliche Datenstrucktur. Dabei werden die Daten in Reihe im Arbeitsspeicher hinterlegt, vergleichbar mit der Python Liste.\n", + "Ein Array ist eine kontinuierliche Datenstruktur. Dabei werden die Daten in Reihe im Arbeitsspeicher hinterlegt, vergleichbar mit der Python Liste.\n", "\n", "## Erstellen von Arrays\n", "\n", "Alle folgenden Beispiele finden Sie im [Beginners Guide](https://numpy.org/doc/stable/user/absolute_beginners.html).\n", "\n", - "Für unser erstes Beispiel erstellen wir aus einer Python liste ein [NumPy Array](https://numpy.org/doc/stable/reference/arrays.html)." + "Für unser erstes Beispiel erstellen wir aus einer Python Liste ein [NumPy Array](https://numpy.org/doc/stable/reference/arrays.html)." ] }, { @@ -306,7 +306,7 @@ } }, "source": [ - "Diese Datenstrucktur wird Allgemein auch Matrix gennant. Der Zugriff auf ein Element einer Matrix folgt nach dem Prinzip \"Spalte->Reihe\". Die erste Spalte ist demnach:" + "Diese Datenstruktur wird Allgemein auch Matrix gennant. Der Zugriff auf ein Element einer Matrix folgt nach dem Prinzip \"Spalte->Reihe\". Die erste Spalte ist demnach:" ] }, { @@ -353,7 +353,7 @@ } }, "source": [ - "Der zugriff auf ein einzelnes element erfolgt dann analog:" + "Der Zugriff auf ein einzelnes Element erfolgt dann Analog:" ] }, { @@ -400,7 +400,7 @@ } }, "source": [ - "Oder mit der NumPys eigener Syntax `arr[, ]`" + "Oder mit NumPys eigener Syntax `arr[, ]`" ] }, { @@ -449,12 +449,12 @@ "source": [ "## Platzreservierung\n", "\n", - "Falls bekannt ist wie viele Elemente ein Array im späteren Programmverlauf haben soll, bietet einem NumPy die möglichkeit diesen Platz im speicher gewissermaßen zu reservieren.\n", + "Falls bekannt ist, wie viele Elemente ein Array im späteren Programmverlauf haben soll, bietet einem NumPy die Möglichkeit diesen Platz im Speicher gewissermaßen zu reservieren.\n", "Hierfür gibt es einige Funktionen.\n", "\n", "### Ones\n", "\n", - "1 Dimensionales NumPy Array der größe 10 mit 1 gefüllt:" + "1 Dimensionales NumPy Array der Größe 10 mit 1 gefüllt:" ] }, { @@ -552,7 +552,7 @@ "source": [ "### Empty\n", "\n", - "Analog mit zufälligen Werten (bzw. Werte die bereits an der Speicherstelle waren, meistens 0):" + "Analog mit zufälligen Werten (bzw. Werte, die bereits an der Speicherstelle waren, meistens 0):" ] }, { @@ -812,7 +812,7 @@ "\n", "*1 Punkt*\n", "\n", - "Erstellen Sie ein NumPy Array mit 11 Elementen mittels `linspace`, Dabei soll der Startwert = -4 und der Endwert = 17 sein. Speichern Sie das Ergbniss in der Variablen `x_scale`. " + "Erstellen Sie ein NumPy Array mit 11 Elementen mittels `linspace`. Dabei soll der Startwert = -4 und der Endwert = 17 sein. Speichern Sie das Ergbniss in der Variablen `x_scale`. " ] }, { @@ -912,8 +912,8 @@ "Wie dem [Getting Started](https://matplotlib.org/stable/users/getting_started/index.html#getting-started) Beispiel zu entnehmen, wollen wir einmal die Sinus Funktion plotten.\n", "\n", "Dazu brauchen wir zwei Attribute:\n", - "1. Die x-Skala - Dies kann die Länge eines Datensets sein, oder ein allegemeiner Linespace. Aufjedenfall eine Liste bzw. Array.\n", - "2. Die y-Skala - Im Allgemeinen die Werte eines zu plottenden Datensets. Aufjedenfall auch eine Liste bzw. Array.\n", + "1. Die x-Skala - Dies kann die Länge eines Datensets sein, oder ein allgemeiner Linespace. Auf jeden Fall eine Liste bzw. Array.\n", + "2. Die y-Skala - Im Allgemeinen die Werte eines zu plottenden Datensets. Auf jeden Fall auch eine Liste bzw. Array.\n", "\n", "Plotten wir im Folgenden die Sinus Funktion. Eine der schönen Eigenschaften der Sinus Funktion ist, dass diese sich nach dem Intervall $[0...2\\pi]$ wiederholt. Daher enthält die x-Skala einen linespace von $[0...2\\pi]$. Als Wert für $\\pi$ wird die NumPy Konstante [np.pi](https://numpy.org/doc/stable/reference/constants.html#numpy.pi) verwendet.\n", "\n", @@ -1027,7 +1027,7 @@ "source": [ "## Aufgabe - Erster eigener Plot Square Root\n", "\n", - "Analog zu voheriger Erklärung Plotten Sie im folgenden die Funktion Square Root Mathematisch definiert als $f(x) = \\sqrt x; \\quad x \\geq 0$.\n", + "Analog zu voheriger Erklärung plotten Sie im folgenden die Funktion Square Root, Mathematisch definiert als $f(x) = \\sqrt x; \\quad x \\geq 0$.\n", "\n", "Gehen Sie dabei wie folgt vor:\n", "1. Definieren Sie einen **geeigneten** [Linespace](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html#numpy-linspace) für die Zahlenraum 0...100. (Tipp: Achten Sie auf die Definition! Die Wurzel ist nur für positive Zahlen definiert.)\n", @@ -1087,9 +1087,9 @@ "source": [ "# Styling\n", "\n", - "Da bei mehreren Plots der Überblick schnell verloren geht beschäftigen wir uns im folgenden mit dem Styling. Dabei gehen wir im Schnelldurchlauf durch alle Parameter.\n", + "Da bei mehreren Plots der Überblick schnell verloren geht, beschäftigen wir uns im folgenden mit dem Styling. Dabei gehen wir im Schnelldurchlauf durch alle Parameter.\n", "\n", - "Die Grundlage für alle folgenden Plots werden in nächster Zelle gesetzt." + "Die Grundlage für alle folgenden Plots werden in der nächsten Zelle gesetzt." ] }, { @@ -1129,7 +1129,7 @@ "source": [ "## Farbe ändern\n", "\n", - "Die Standard Farbe für den ersten Plot ist immer Blau. Um die Farbe zu verändern wird `plt.plot` der Parameter `color` übergeben. Dieser erwartet einen String. Für eine genauere Erläuterung lesen Sie die Dokumentation zu [Specifying color](https://matplotlib.org/stable/users/explain/colors/colors.html). Für dieses Notebook werden die Beispiele mit den \"Single Character Shorthands\" (Aus der Dokumentation zu entnehmen) ausgestattet.\n", + "Die Standard Farbe für den ersten Plot ist immer Blau. Um die Farbe zu verändern wird `plt.plot` der Parameter `color` übergeben. Dieser erwartet einen String. Für eine genauere Erläuterung, lesen Sie die Dokumentation zu [Specifying color](https://matplotlib.org/stable/users/explain/colors/colors.html). Für dieses Notebook werden die Beispiele mit den \"Single Character Shorthands\" (Aus der Dokumentation zu entnehmen) ausgestattet.\n", "\n", "Plotten wir den Sinus nun in Rot:" ] @@ -1181,7 +1181,7 @@ "source": [ "## Titel für den Plot setzen\n", "\n", - "Dafür wird [plt.title](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.title.html) der Paramter wird als String übergeben:" + "Dafür wird [plt.title](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.title.html) der Paramter als String übergeben:" ] }, { @@ -1232,7 +1232,7 @@ "source": [ "## Legende und Labels\n", "\n", - "Um eine Legende anzuzeigen muss vor `plt.show` die Funktion [plt.legend](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.legend.html) aufgerufen werden. Damit dies Wirkung zeigt braucht muss jeder Plot mit dem Parameter `label` (als String) ausgezeichnet werden. Plotten wir im Folgenden den Sinus und Kosinus mit entsprechenden Labels." + "Um eine Legende anzuzeigen, muss vor `plt.show` die Funktion [plt.legend](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.legend.html) aufgerufen werden. Damit dies Wirkung zeigt, muss jeder Plot mit dem Parameter `label` (als String) ausgezeichnet werden. Plotten wir im Folgenden den Sinus und Kosinus mit entsprechenden Labels." ] }, { @@ -1284,7 +1284,7 @@ "source": [ "## Linestyle\n", "\n", - "Die letze wichtige Eigenschaft ist das Setzen eines Linestyles. Dazu wird `plt.plot` der parameter `linestyle` als String übergeben. Entnehmen Sie die verschiednen Linestyles bitte der Dokumentation zu [Linestyles](https://matplotlib.org/stable/gallery/lines_bars_and_markers/linestyles.html).\n", + "Die letze wichtige Eigenschaft ist das Setzen eines Linestyles. Dazu wird `plt.plot` der Parameter `linestyle` als String übergeben. Entnehmen Sie die verschiedenen Linestyles bitte der Dokumentation zu [Linestyles](https://matplotlib.org/stable/gallery/lines_bars_and_markers/linestyles.html).\n", "\n", "Sinus als `dashed` line:" ] @@ -1338,12 +1338,12 @@ "\n", "*8 Punkte*\n", "\n", - "In der nächsten Aufgabe wollen wir gleich zwei Funktionen Plotten. $f(x) = \\sqrt x; x \\geq 0$ und $g(x) = x^2$.\n", + "In der nächsten Aufgabe wollen wir gleich zwei Funktionen plotten. $f(x) = \\sqrt x; x \\geq 0$ und $g(x) = x^2$.\n", "\n", "Gehen Sie dabei wie folgt vor:\n", "1. Definieren Sie einen geeigneten [Linespace](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html#numpy-linspace) für die Zahlenraum 0...3. (Tipp: Achten Sie auf die Definition! Die Wurzel ist nur für positive Zahlen definiert.)\n", "2. Berechnen Sie mittels der Funktion [np.sqrt](https://numpy.org/doc/stable/reference/generated/numpy.sqrt.html#numpy.sqrt) die Werte für die Wurzel.\n", - "3. Berechnen Sie mittels der Funktion [np.square](https://numpy.org/doc/stable/reference/generated/numpy.square.html#numpy-square) die Werte für die Quadrat Zahlen\n", + "3. Berechnen Sie mittels der Funktion [np.square](https://numpy.org/doc/stable/reference/generated/numpy.square.html#numpy-square) die Werte für die Quadratzahlen\n", "4. Geben Sie den beiden Plots die Farben Grün & Rot. Nutzen Sie gerne die [Color Shorthands](https://matplotlib.org/stable/users/explain/colors/colors.html) aus der Dokumentation.\n", "5. Plotten Sie die Square Funktion mit dem Linestyle `dashdot`, wie der Dokumentation zu entnehmen [Linestyles](https://matplotlib.org/stable/gallery/lines_bars_and_markers/linestyles.html)\n", "6. Geben Sie den beiden Plots angemessene Labels.\n", @@ -1424,7 +1424,7 @@ "source": [ "# Warum Zufall?\n", "\n", - "Für statistische Analysen jeglicher Art ist es wichtig seine Werkzeuge zu verstehen. Da nicht immer direkt ein Dataset vorliegt oder dieses zurzeit noch im Erstellungsprozess ist, gibt es die Möglichkeit die mathematischen und programmatischen Werzeuge zuvor an nachvollziebaren Zufallsdaten zu testen. Dabei wollen wir in dieser Übung lernen, was Zufall ist, wie Zufallsgeneratoren funktionieren und wie der Zufall auf bestimmte Art manipuliert werden kann.\n", + "Für statistische Analysen jeglicher Art ist es wichtig seine Werkzeuge zu verstehen. Da nicht immer direkt ein Dataset vorliegt, oder dieses zurzeit noch im Erstellungsprozess ist, gibt es die Möglichkeit, die mathematischen und programmatischen Werzeuge zuvor an nachvollziebaren Zufallsdaten zu testen. Dabei wollen wir in dieser Übung lernen, was Zufall ist, wie Zufallsgeneratoren funktionieren und wie der Zufall auf bestimmte Art manipuliert werden kann.\n", "\n", "---" ] @@ -1478,11 +1478,11 @@ "\n", "Wenn $ c = 0 $ dann nennt man den Generator auch _Multiplicative Congruent Generator (MCG)_.\n", "\n", - "Die Werte haben folgenden nutzen in der Funktion:\n", + "Die Werte haben folgenden Nutzen in der Funktion:\n", "\n", "- $X_n$ ist der Startwert oder seed\n", - "- $X_{n+1}$ ist der folgewert der im nächsten schritt für $X_n$ eingesetzt wird\n", - "- $a$ ist der Vorfaktor vom Startwert dieser wird skaliert, deshalb wird er skalar gennant\n", + "- $X_{n+1}$ ist der Folgewert der im nächsten Schritt für $X_n$ eingesetzt wird\n", + "- $a$ ist der Vorfaktor vom Startwert. Dieser wird skaliert, deshalb wird er Skalar gennant\n", "- $c$ ist das hinzuaddierte Offset\n", "- $m$ ist der Restklassenring oder auch Modulus genannt" ] @@ -1508,7 +1508,7 @@ "Schreibe einen _Linear Congruent Generator_ mit dem funktionsnamen `lcg`.\n", "\n", "- Nutze die oben gegebene Definition\n", - "- Checke auch das Werte nicht verwendet werden dürfen (Bsp. $n \\geq 0$)\n", + "- Prüfe auch, das Werte nicht verwendet werden dürfen (Bsp. $n \\geq 0$)\n", "- `lcg` muss ein unendlicher Generator sein" ] }, @@ -1666,9 +1666,9 @@ " \n", "
\n", "
\n", - "

Linear Congruent Generators zeichnen sich durch ihre Stabilität und Geschwindigkeit als Hervorragende Zufallsgeneratoren. Doch 2014 gelang Melissa E. O'Neil ein neuer durchbruch in der Konzeption von Pseudozufallsgeneratoren. Das Problem mit existierenden Zufallsgeneratoren ist entweder ihre Stabilität (Wie vorhersehbar die Zufallszahlen sind) oder ihrer Geschwindigkeit (Wie lange der Zufallsgenerator braucht um die nächste Zufallszahl zu errechnen).

\n", - "

Ihr Durchbruch gelang indem Sie die Vorteile eines Linear Congruent Generators mit dem eines XorShift Generators verband. Dadurch erreichte Sie nicht nur eine Normalverteilung in den generierten Zufallszahlen (und eine damit einhergende Stabilität), Sie hatte auch eine Family von schnellen einfachen Algorithmen entwickeln. Diese nennen sich PCG - Permuted Congruential Generator.

\n", - "

Die Implementierungsdetails lassen wir im nächsten Schritt aus, da diese sich nicht einfach in Python umzusetzen sind. Auf der Webseite pcg-random.org lassen sich implemtierungen für C & C++ finden. Als weiterführende Literatur ist PCG: A Family of Simple Fast Space-Efficient Statistically Good Algorithms for Random Number Generation - Melissa E. O’Neill als Literatur angegeben.

\n", + "

Linear Congruent Generators zeichnen sich durch ihre Stabilität und Geschwindigkeit als Hervorragende Zufallsgeneratoren. Doch 2014 gelang Melissa E. O'Neil ein neuer Durchbruch in der Konzeption von Pseudozufallsgeneratoren. Das Problem mit existierenden Zufallsgeneratoren ist entweder ihre Stabilität (Wie vorhersehbar die Zufallszahlen sind) oder ihre Geschwindigkeit (Wie lange der Zufallsgenerator braucht um die nächste Zufallszahl zu errechnen).

\n", + "

Ihr Durchbruch gelang, indem Sie die Vorteile eines Linear Congruent Generators mit dem eines XorShift Generators verband. Dadurch erreichte Sie nicht nur eine Normalverteilung in den generierten Zufallszahlen (und eine damit einhergende Stabilität), Sie hatte auch eine Family von schnellen einfachen Algorithmen entwickelt. Diese nennen sich PCG - Permuted Congruential Generator.

\n", + "

Die Implementierungsdetails lassen wir im nächsten Schritt aus, da diese nicht einfach in Python umzusetzen sind. Auf der Webseite pcg-random.org lassen sich Implemtierungen für C & C++ finden. Als weiterführende Literatur ist PCG: A Family of Simple Fast Space-Efficient Statistically Good Algorithms for Random Number Generation - Melissa E. O’Neill als Literatur angegeben.

\n", "
\n", "\n", "\n", @@ -1697,8 +1697,8 @@ "\n", "- Gegeben ist der Anfangszustand des Generators.\n", "- Nutze die Dokumentation und rufe den `default_rng` aus dem `numpy.random` Modul, **20** mal auf speichere die Werte in der variablen `pcgs`. *(Tipp: Nutze ein NumPy Array)*\n", - "- Sortiere im nächsten Schritt die in `pcgs` gespeicherten Werte und speicher diese in `pcgs_sorted`\n", - "- Plotte sinnvoll beide Array, gestalte den Plott angemessen." + "- Sortiere im nächsten Schritt die in `pcgs` gespeicherten Werte und speichere diese in `pcgs_sorted`\n", + "- Plotte sinnvoll beide Array. Gestalte den Plot angemessen." ] }, { @@ -1816,7 +1816,7 @@ "\n", "# Plot Types\n", "\n", - "Im folgenden Kapitel beschäftigen wir uns mit verschiedensten Plot typen." + "Im folgenden Kapitel beschäftigen wir uns mit verschiedensten Plot Typen." ] }, { @@ -1890,9 +1890,9 @@ "source": [ "## Bar Charts\n", "\n", - "Beliebt sind Barcharts. Dazu werden aber mehrere Parameter benötigt. Da einfache mathematische Funktionen bei dieser Art Plot keinen Sinn ergeben.\n", + "Beliebt sind Barcharts. Dazu werden aber mehrere Parameter benötigt, da einfache mathematische Funktionen bei dieser Art Plot keinen Sinn ergeben.\n", "\n", - "Konsultieren wir dafür folgendes Beispiel.\n", + "Konsultieren wir dafür folgendes Beispiel:\n", "\n", "Wir wollen wissen wie viele Kinder an einer Grundschule in jeder Klassenstufe sind.\n", "Dazu benötigen wir 2 Listen.\n", @@ -1984,7 +1984,7 @@ "source": [ "### Bessere Datenrepresentation\n", "\n", - "Da die Daten aus `classes` & `kids` miteinander eine Verbindung teilen wäre die Repräsentation mittels Dictionary die klügere Wahl um keine Fehler in den Plot zu bringen.\n", + "Da die Daten aus `classes` & `kids` miteinander eine Verbindung teilen wäre, die Repräsentation mittels Dictionary die klügere Wahl, um keine Fehler in den Plot zu bringen.\n", "\n", "Mittels der `.keys` & `.values` Funktion auf dem Dictionary lassen sich dann die Daten gezielt plotten.\n", "\n", @@ -2167,7 +2167,7 @@ "source": [ "### X-Label\n", "\n", - "Analog Dazu die Beschriftung der X-Achse mit `plt.xlabel`." + "Analog dazu die Beschriftung der X-Achse mit `plt.xlabel`." ] }, { @@ -2508,7 +2508,7 @@ } }, "source": [ - "Zum setzen von Prozentwerten wird der Parameter `autopct` verwendet. Dieser nutzt einen Format String oder eine Funktion zum definieren der Werte. Schaue dazu für mehr in die Dokumentation für [autpct](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.pie.html#matplotlib-pyplot-pie), eine Dokumentation zu Formatstrings findest du [hier](https://www.geeksforgeeks.org/format-specifiers-in-c/).\n", + "Zum Setzen von Prozentwerten wird der Parameter `autopct` verwendet. Dieser nutzt einen Format String oder eine Funktion zum Definieren der Werte. Schaue dazu für mehr in die Dokumentation für [autpct](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.pie.html#matplotlib-pyplot-pie), eine Dokumentation zu Formatstrings findest du [hier](https://www.geeksforgeeks.org/format-specifiers-in-c/).\n", "\n", "Beispiel für Prozentwerte:" ] @@ -2626,7 +2626,7 @@ } }, "source": [ - "Zum herausnehmen von Kuchenstücken gibt es den Parameter `explode` dieser erwartet eine Liste mit Fließkommezahlen die zwischen 0.0 - Standardwert und 1.0 - absoluter Explode liegen.\n", + "Zum Herausnehmen von Kuchenstücken gibt es den Parameter `explode`. Dieser erwartet eine Liste mit Fließkommazahlen die zwischen 0.0 - Standardwert und 1.0 - absoluter Explode liegen.\n", "\n", "Beispiel Klasse 3 ist vom Ursprung 20% entfernt:" ] @@ -2784,7 +2784,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.7" + "version": "3.12.5" } }, "nbformat": 4,